Ruby:方法作为数组元素 - 它们如何工作?

Nek*_*oru 13 ruby

这可能不是你应该在家里尝试的东西,但由于某种原因我试图在Ruby中创建一个方法数组.

我开始定义两种方法.

irb(main):001:0> def test1
irb(main):002:1>   puts "test!"
irb(main):003:1> end
=> nil
irb(main):004:0> def test2
irb(main):005:1>   puts "test2!"
irb(main):006:1> end
=> nil
Run Code Online (Sandbox Code Playgroud)

当你试图把它放到一个实际的数组中时会发生奇怪的事情.它似乎运行两种方法.

irb(main):007:0> array = [test1, test2]
test!
test2!
=> [nil, nil]
Run Code Online (Sandbox Code Playgroud)

然后,阵列是空的.

irb(main):008:0> puts array


=> nil
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么它运行这些方法?除此之外,整个运动是否真的需要一个驱魔人?

Lar*_*eth 21

你在数组中存储的是调用方法的结果,而不是方法本身.

def test1
  puts "foo!"
end

def test2
  puts "bar!"
end
Run Code Online (Sandbox Code Playgroud)

您可以存储对实际方法的引用,如下所示:

> arr = [method(:test1), method(:test2)]
# => [#<Method: Object#test1>, #<Method: Object#test2>] 
Run Code Online (Sandbox Code Playgroud)

稍后,您可以像这样调用引用的方法:

> arr.each {|m| m.call }
foo!
bar!
Run Code Online (Sandbox Code Playgroud)


Mar*_*lez 9

@alestanis 很好地解释了原因。如果您试图存储这些方法,那么您可以按照 Lars Haugseth 所说的进行操作,也可以执行以下操作:

test1 = Proc.new { puts "test!" }
test2 = Proc.new { puts "test2!" }
a = [test1, test2]
Run Code Online (Sandbox Code Playgroud)

这可能会使您的代码更具可读性。

这是一个 irb 运行。

1.9.3p194 :009 > test1 = Proc.new { puts "test!" }
 => #<Proc:0x00000002798a90@(irb):9> 
1.9.3p194 :010 > test2 = Proc.new { puts "test2!" }
 => #<Proc:0x00000002792988@(irb):10> 
1.9.3p194 :011 > a = [test1, test2]
 => [#<Proc:0x00000002798a90@(irb):9>, #<Proc:0x00000002792988@(irb):10>] 
Run Code Online (Sandbox Code Playgroud)