【问题标题】:Ruby Array Initialization [duplicate]Ruby数组初始化[重复]
【发布时间】:2014-10-13 10:43:02
【问题描述】:

我需要知道这两个语句之间的技术差异以及为什么会这样:

arr = Array.new(3, "abc")
=> ["abc","abc","abc"]
arr.last.upcase!
=> "ABC"
arr
=>["ABC","ABC","ABC"]     # which is **not** what I excepted

另一方面:

arr = Array.new(3){"abc"}
=> ["abc","abc","abc"]
arr.last.upcase!
=>"ABC"
arr
=> ["abc","abc","ABC"]     # which is what I excepted

【问题讨论】:

  • 来自documentation: "请注意,第二个参数使用对同一对象的引用填充数组。因此,仅在需要实例化具有本机不可变数组的情况下才推荐对象,例如符号、数字、真假。”
  • 我要补充一点,以防万一您是 Java 程序员,Ruby 字符串是可变对象,不像 Java 那样。
  • 我知道这是重复的(已经被问过很多次了),但是我的搜索失败了。有人手头有链接吗?
  • @JörgWMittag,当 SO 的搜索引擎没有找到我要查找的内容时,我已经成功使用 Google,搜索字符串中包含“site:stackoverflow.com”。跨度>

标签: ruby


【解决方案1】:

始终在方法调用之前评估参数,而仅在方法调用期间在方法控制的时间(如果曾经评估的话)评估块。

在您的第一个示例中,参数 "abc" 在调用方法 new 之前被评估一次。评估的对象被传递给方法new。在创建的数组的所有三个元素中使用完全相同的对象。修改一个意味着修改所有。

在您的第二个示例中,每次为数组生成新元素时都会评估块 {"abc"}。创建的数组中的三个元素是不同的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2011-05-23
    • 1970-01-01
    • 2015-07-25
    • 2012-04-30
    • 2012-09-29
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多