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_2gets が に初期化されるのはなぜ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

メソッドを宣言すると単純に戻りnilますが、メソッドを呼び出すと、returnキーワードを使用しない限り、そのメソッドの最後の行のリターンのo/pが返されます。

以下はあなたのために働くはずです

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

array_2 ||=some_method
于 2012-10-15T12:27:41.587 に答える
1

メソッド定義式 ( def) の戻り値は実装定義です。ほとんどの Ruby 実装nilは式から単純に戻りdefますが、たとえば Rubinius はCompiledMethodオブジェクトにラップされたメソッドのコンパイル済みコードを返します。

于 2012-10-15T11:41:59.600 に答える