Ruby的员工认为他们将如何摆脱静态成员?(另:爪哇移民提示)

Ruby的员工认为他们将如何摆脱静态成员?(另:爪哇移民提示),ruby,Ruby,昨天我在#ruby on Freenode上得到了一些关于ruby与Java有什么不同的真正建议,当时有人指出ruby没有静态成员。我真的很惊讶 有谁能告诉我什么可以代替使用静态方法(静态变量可以用@@@复制)(有人告诉我在程序中使用更好的设计,而不是使用像静态函数这样的陈旧概念。) PS:对于一个有Java经验的Ruby学习者,你有没有其他的资源/技巧/链接可以推荐 当前打开:开始Ruby第36页。tl;答:给它时间,拥抱差异,它最终会来到你身边 是否有其他来源/提示/链接 你可以推荐一个Ru

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

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

PS:对于一个有Java经验的Ruby学习者,你有没有其他的资源/技巧/链接可以推荐


当前打开:开始Ruby第36页。

tl;答:给它时间,拥抱差异,它最终会来到你身边

是否有其他来源/提示/链接 你可以推荐一个Ruby学习者 有Java经验吗

是的,忘记你迄今为止所学的东西,从头开始。自2009年1月以来,我一直在RubyLearning.org上教授Ruby课程,通常只有Java背景的人最难适应Ruby。因为我没有太多的Java经验,所以我不能说这是为什么,但这种观察在每一门新课程中都适用

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

在这番咆哮之后,以下是一些更实用的技巧:

如果你对书籍感兴趣,我通常推荐“基础扎实的Rubyist”,其次是“雄辩的Ruby”和“Ruby最佳实践”。不久前,我在博客上写道:

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


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

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

class MyClass
  def self.static_method
    #do stuff
  end
end
我推荐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
>> 
$irb
>>“abc”.class=>String
>>“abc”.methods=>[“upcase!”,“zip”,“find_index”,“between?”,“unpack”,“enum_slice”,“to_f”,“minmax”,“line”,“sub”,“methods”,“send”,“replace”,“empty?”,“group_by”,“square”,“crypt”,“gsub!”,“take”,“find_all”,“min_by”,“bytes”,“each_cons”,“entries”,“gsub”,“单例方法”、“实例评估”、“to_str”、“first”、“chop!”、“intern”、“nil?”、“succ”、“capitalize!”、“take_while”、“select”、“max_by”、“chars”、“enum_cons”、“tr!”、“protected_方法”、“instance_exec”、“display”、“sort”、“chop”、“污点?”、“dump”、“method”、“include?”、“untaint”、“instance_of?”、“chomp!”、“swapcase!”、“drop”、“equal?”、“等”“拒绝”、“十六进制”、“最小最大值依据”、“求和”、“散列”、“私有方法”、“全部”、“tr\u s!”、“排序依据”、“chomp”、“upcase”、“开始使用?”、“成功!”、“种类?”、“条带!”、“冻结”、“删除时删除”、“删除”、“删除”、“删除”、“oct”、“id”、“切片”、“casecmp”、“条带”、“任意”、“删除!”、“公共方法”、“结束使用?”、“downcase”、“百分比”、“对象id”、“是否为?”“扫描”、“lstrip!”、“循环”、“映射”、“成员?”、“点击”、“类型”、“*”、“分割”、“插入”、“每个单元都有索引”、“加号”、“计数”、“lstrip”、“一个?”、“挤压!”、“实例变量”、“标识”、“冻结?”、“大写”、“下一个!”、“每条线”、“到枚举”、“rstrip!”、“到a”、“ljust”、“响应到?”、“最多”、“每个”、“注入”、“tr”、“切片”、“类”、“反向”、“长度”“,”带有索引的枚举“,”rpartition“,”rstrip“,”none?”,”实例变量“,”get“,”find“,”==”,”swapcase“,”发送“,”==”,”min“,”每个字节“,”扩展“,”到“,”rjust“,”索引“,”>=”,”大小“,”减少“,”tr s“,”如果您将“静态方法/属性”理解为“类方法/属性”,那么Ruby肯定拥有它们

Ruby类方法是使用
self
定义的:

class MyClass
  def instance_method
    ...
  end

  def self.class_method
    ...
  end
end
类变量可以使用
@
表示法创建。不过要小心-

注二:

  • 在Ruby中,类本身就是实例(类
    class
    )。从这个意义上讲,类方法与实例方法并没有真正的区别;它们只是有一个稍微不同的语法来简化常见用例
  • 在Ruby中,一切都是动态的,这意味着在执行时的任何时候,一段代码都可以“re-o”