【问题标题】:Ruby array creation, Array.new vs []Ruby 数组创建,Array.new 与 []
【发布时间】:2011-01-05 07:13:48
【问题描述】:

这两种说法有什么区别?我在我的 Rails 应用程序中使用它们,在我看来它们做同样的事情

array_a = Array.new
array_b = []

【问题讨论】:

  • 要清除/重置数组而不创建新对象,使用array.clear实现#=> [ ]

标签: ruby-on-rails ruby


【解决方案1】:

这两个语句在功能上是相同的。 Array.new 但是可以接受参数和块:

Array.new # => []
Array.new(2) # => [nil,nil]
Array.new(5,"A") # =>["A","A","A","A","A"]

a = Array.new(2,Hash.new)
a[0]['cat'] = 'feline'
a # => [{"cat"=>"feline"},{"cat"=>"feline"}]
a[1]['cat'] = 'Felix'
a # => [{"cat"=>"Felix"},{"cat"=>"Felix"}]

a = Array.new(2){Hash.new} # Multiple instances
a[0]['cat'] = 'feline'
a # =>[{"cat"=>"feline"},{}]
squares = Array.new(5){|i|i*i}
squares # => [0,1,4,9,16]

copy = Array.new(squares) # initialized by copying
squares[5] = 25
squares # => [0,1,4,9,16,25]
copy # => [0,1,4,9,16]

注:以上示例取自Programming Ruby 1.9

【讨论】:

  • Array.new(count, object) 产生相同对象的数组是一个陷阱,这意味着我避免使用这种方法。
  • @Andrew:不完全符合“最小惊喜原则”,是吗?
  • 幸运的是,我在怀疑的一分钟内找到了你的答案。
【解决方案2】:

[] 是 Array 类的单例方法 [] 的快捷方式,该方法又以与 Array.new 相同的方式创建一个新数组,因此您可能会说“它们是相同的”而不必太担心.

请注意,irb 中对[] 的每次调用都会创建一个新数组:

>> [].object_id
=> 2148067340
>> [].object_id
=> 2149414040

来自Ruby's C code

rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);

【讨论】:

    【解决方案3】:

    Hash.new{}。他们是一样的。包括速度。

    【讨论】:

      【解决方案4】:

      基本没有区别

      【讨论】:

        【解决方案5】:

        没有区别,但是……

        其他人已经回答了你

        这两个语句在功能上是相同的

        但是有一些指导方针可以指导您何时应该使用每一个(因此您的代码更易于阅读)。背后的原因是:

        必须编写程序供人们阅读,并且只能偶尔供机器执行。

        来自: https://github.com/rubocop-hq/ruby-style-guide#literal-array-hash

        首选文字数组和哈希创建表示法(除非您需要将参数传递给它们的构造函数)。

        因此,如果您要创建一个空数组,[] 是最好的选择,但如果您需要使用一组 N 个 nil 对象创建数组,那么您应该编写 Array.new(N)

        【讨论】:

          猜你喜欢
          • 2014-04-20
          • 2011-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多