19

書き込めて本当に良かったです

@foo ||= "bar_default"

また

@foo ||= myobject.bar(args)

しかし、私は次のようなものを書く方法があるかどうかを見てきました

@foo ||= do
  myobject.attr = new_val
  myobject.other_attr = other_new_val
  myobject.bar(args)
end

実際に機能するコードでは、次のようなものとほぼ同等です

@foo = if !@foo.nil?
         @foo
       else
         myobject.attr = new_val
         myobject.other_attr = other_new_val
         myobject.bar(args)
       end

そして、「getblock」のような独自のグローバルメソッドを記述して、一般的なブロックの結果をラップして返すことができると思いますが、これを行う組み込みの方法が既にあるかどうか疑問に思っています。

4

3 に答える 3

44

begin..を使用できますend:

@foo ||= begin
  # any statements here
end

または、ブロックの内容を別のメソッドに分解することを検討してください。

于 2012-12-30T04:46:49.533 に答える
4

私は通常、次のように書きます。

@foo ||= (
  myobject.attr = new_val
  myobject.other_attr = other_new_val
  myobject.bar(args)
)
于 2015-02-11T21:35:56.983 に答える
0
@foo ||= unless @foo
  myobject.attr = new_val
  myobject.other_attr = other_new_val
  myobject.bar(args)
end
于 2012-12-30T04:45:36.623 に答える