0

我注意到||=以下一些有趣的用法 -

代码 1

array_1 ||= begin
    (1..5).to_a.map {|el| el*10}
end
puts array_1.to_s # [10,20,30,40,50]

所以我执行了它的以下修改版本 -

代码 2

array_2 ||= def some_method
    (1..5).to_a.map {|el| el*10}
end
puts array_2 # prints nothing
puts array_2.class # NilClass
puts some_method.to_s # [10,20,30,40,50]
  1. 为什么会array_2被初始化为nil
  2. 是否可以some_method使用array_2对象调用?如何?

更新

这就是我对问题 2 所做的

array_2 ||= "We've got #{def some_method;(1..5).to_a.map {|el| el*10};end;array_2.send(:some_method)}"
puts array_2 # We've got [10, 20, 30, 40, 50]
4

2 回答 2

1

方法定义表达式 ( ) 的返回值def是实现定义的。大多数 Ruby 实现只是nildef表达式返回,但例如,Rubinius 返回包装在CompiledMethod对象中的方法的编译代码。

于 2012-10-15T11:41:59.600 回答
1

当您声明任何方法时,它只会返回nil,但是当您调用任何方法时,它将返回该方法中最后一行 return 的 o/p,除非您使用 return 关键字。

以下应该对你有用

def some_method
    return (1..5).to_a.map {|el| el*10}
end

array_2 ||=some_method
于 2012-10-15T12:27:41.587 回答