有些疑惑w.r.t.短路(|| =)运算符

时间:2012-10-15 11:26:27

标签: ruby operators

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

代码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?如何?
  3. 更新

    这就是我对问题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]
    

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

以下应该适合你

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

array_2 ||=some_method