Ruby 的人们认为他们将如何摆脱静态成员? (另:爪哇移民小贴士)

问题描述 投票:0回答:4

昨天,当有人指出 Ruby 没有静态成员时,我在 Freenode 上的 #ruby 上获得了一些关于 Ruby 与 Java 有何不同的真正建议。我真的很惊讶。

谁能告诉我什么是使用静态方法的替代品(静态变量可以使用@@复制)(有人告诉我在程序中使用更好的设计,而不是使用静态函数等过时的概念。)

PS:您是否可以向具有 Java 经验的 Ruby 学习者推荐任何其他资源/技巧/链接?

当前:入门 Ruby 第 36 页。

ruby
4个回答
4
投票

tl;博士回答:给它时间并接受差异,它最终会来找你。

还有其他来源/提示/链接吗 你会推荐给 Ruby 学习者 有 Java 经验吗?

是的,忘记你到目前为止所学的内容并从头开始。自 2009 年 1 月以来,我一直在 RubyLearning.org 上教授 Ruby 课程,通常只有 Java 背景的人在适应 Ruby 时遇到最大的困难。由于我没有太多的 Java 经验,所以我不能真正说出原因,但这一观察结果适用于每一门新课程。

在我看来,许多 Java 开发人员出于某种原因认为 Java 中完成事情的方式是唯一的方法/正确的方法。但在很多方面,编程语言就像真正的语言。有些非常接近,概念(和语法)在它们之间很容易翻译。其他人有很大不同,但这并不意味着他们不能表达相同的东西。问“如何在没有静态成员的情况下摆脱困境”就像一个讲德语的人问一个中国人如何在不使用语法情况的情况下摆脱困境,这就是语言的工作方式。一般来说,说“编程语言 X 有这个,我如何在语言 Y 中做到这一点”是一个坏主意,但要尝试找出 Y 中通常是如何完成事情的。

在这篇咆哮之后,这里有一些更实用的提示:

如果你对书籍感兴趣,我通常推荐《The Well-Grounded Rubyist》,其次是《Eloquent Ruby》和《Ruby Best Practices》。我不久前在博客上谈到了这一点:

http://citizen428.net/blog/2011/04/23/ruby-book-recommendations/

我建议的另一件事是编写大量代码,使用 Ruby Koans、编程 katas 或为开源项目做出贡献。这样做时,请尝试让 Ruby 的功能而不是 Java 程序影响设计。一开始这可能很难,但我看到人们通过接受语言之间的差异而不是强迫一种语言与另一种语言相似,在很短的时间内(我们的课程为期 2 个月)取得了很大的进步。编程也是一种思考和解决问题的方式,语言只是工具。显然您已经学习了第一个,现在尝试将其应用到不同的语言,遵循不同的范例。

您可能听说过每年学习一门新的编程语言是很好的。我并不是特别关心时间间隔,但是学习一门新语言很可能在某种程度上让你成为一个更好的程序员,因为它常常迫使你从一个新的角度解决问题,从而增加你的“解决问题的词汇量” 。


0
投票

我推荐 Flanagan 和 Matsumoto 所著的 Ruby 编程语言。第 7.1.15 节讨论类变量,第 7.1.16 节讨论类实例变量。

第 1.1.9 节讨论了 Ruby 的惊喜。对于 Java 程序员来说,令人惊讶的是字符串是可变的。 (而且一切都已分类)。

使用交互式 shell irb,尝试以下操作

$ irb
>> "abc".class => String
>> "abc".methods => ["upcase!", "zip", "find_index", "between?", "unpack", "enum_slice", "to_f", "minmax", "lines", "sub", "methods", "send", "replace", "empty?", "group_by", "squeeze", "crypt", "gsub!", "taint", "instance_variable_defined?", "match", "downcase!", "take", "find_all", "min_by", "bytes", "each_cons", "entries", "gsub", "singleton_methods", "instance_eval", "to_str", "first", "chop!", "intern", "nil?", "succ", "capitalize!", "take_while", "select", "max_by", "chars", "enum_cons", "tr!", "protected_methods", "instance_exec", "display", "sort", "chop", "tainted?", "dump", "method", "include?", "untaint", "instance_of?", "chomp!", "swapcase!", "drop", "equal?", "reject", "hex", "minmax_by", "sum", "hash", "private_methods", "all?", "tr_s!", "sort_by", "chomp", "upcase", "start_with?", "succ!", "kind_of?", "strip!", "freeze", "drop_while", "eql?", "next", "collect", "oct", "id", "slice", "casecmp", "grep", "strip", "any?", "delete!", "public_methods", "end_with?", "downcase", "%", "object_id", "is_a?", "scan", "lstrip!", "cycle", "map", "member?", "tap", "type", "*", "split", "insert", "each_with_index", "+", "count", "lstrip", "one?", "squeeze!", "instance_variables", "__id__", "frozen?", "capitalize", "next!", "each_line", "to_enum", "rstrip!", "to_a", "ljust", "respond_to?", "upto", "each", "inject", "tr", "slice!", "class", "reverse", "length", "enum_with_index", "rpartition", "rstrip", "<=>", "none?", "instance_variable_get", "find", "==", "swapcase", "__send__", "===", "min", "each_byte", "enum_for", "extend", "to_s", "rjust", "index", ">=", "size", "reduce", "tr_s", "<=", "clone", "reverse_each", "to_sym", "bytesize", "=~", "instance_variable_set", "<", "detect", "max", "each_char", "each_slice", ">", "to_i", "center", "inspect", "[]", "reverse!", "rindex", "partition", "delete", "[]=", "concat", "sub!", "dup", "<<"]
>> "abc".gsub("b","B")
=> "aBc"
>> "abc".object_id
=> 2149174040
>> "abc".object_id
=> 2149162340
>> "abc".object_id
=> 2149155460
>> a = "abc"
=> "abc"
>> a.class
=> String
>> a.object_id
=> 2150044120
>> a.object_id
=> 2150044120
>> a.object_id
=> 2150044120
>> 

很酷吧?


0
投票

如果您将“静态方法/属性”理解为“类方法/属性”,那么 Ruby 绝对拥有它们。

Ruby 类方法是使用

self
:

定义的
class MyClass
  def instance_method
    ...
  end

  def self.class_method
    ...
  end
end

类变量可以使用

@@
表示法创建。但请注意 - 它们在所有类的层次结构中共享

两个注意事项:

  • 在 Ruby 中,类本身就是实例(属于类
    Class
    )。从这个意义上说,类方法与实例方法并没有真正的区别;它们只是有稍微不同的语法来简化常见用例。
  • 在 Ruby 中,一切都是动态的。这意味着在执行时的任何时刻,一段代码都可以“重新打开”类并添加或修改现有方法 - 无论是实例方法还是类方法。如果你将“静态”理解为“不可变”或“最终”,那么 Ruby 就没有这样的东西。

0
投票

您实际上可以在 Ruby 中定义静态方法。我认为这只是 Ruby 中的命名不同。

class MyClass
  def self.static_method
    #do stuff
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.