ruby内置方法的定义

时间:2015-02-15 15:53:45

标签: ruby-on-rails ruby

我去扔这篇guide-ruby-collections-iv-tips-tricks文章

Array.new(3, rand(100))

这不完全是随机的。看起来rand(100)仅被评估一次。幸运的是,Array#new可以占用一个块,它将为每个元素运行块,为元素分配结果。

Array.new(3) { rand(100) }
=> [10,53,27]

确定

但是,在我可以看到#new Array class方法的实际实现的情况下,我查看了Array's New Method 但是仍然没有明白这一点。

当我使用Rubymine时,我也在那里检查过,这是我在那里找到的

def self.new(*several_variants)
    #This is a stub, used for indexing
end

1:此处*several_variants的含义是什么。

2:如果这个方法的实际定义在哪里。

假设我有class Test; end

我怎样才能编写#new方法,可以接受array, optional-hash and block

1 个答案:

答案 0 :(得分:3)

  

1:这里有几个变量的含义。

这是'splat。':

$ irb
irb(main):001:0> def foo(*bar)
irb(main):002:1> puts bar
irb(main):003:1> puts bar.class
irb(main):004:1> end
=> :foo
irb(main):005:0> foo([1, 2, 3])
1
2
3
Array
=> nil
irb(main):006:0> foo("hello")
hello
Array
=> nil
irb(main):007:0> foo("Hello", "world")
Hello
world
Array
=> nil
irb(main):008:0> foo(a: "hash")
{:a=>"hash"}
Array
=> nil

2:如果这个方法的实际定义在哪里。

它位于C:https://github.com/ruby/ruby/blob/trunk/array.c#L5746https://github.com/ruby/ruby/blob/trunk/array.c#L722-L777

rb_ary_initialize(int argc, VALUE *argv, VALUE ary)

当然,这不是那么有用,因为:

  

我怎么写#new方法可以接受数组,可选的哈希和块?

通常,在Ruby中,您不编写new,而是编写initializenew来电initialize。这样做很简单:

class Foo
  def initialize(*args, &blk)
    # stuff goes here
  end
end

args将拥有所有参数,&blk将有一个块,如果你被传递了。