1

を明示的に返さないのはRubyで慣用的nilですか? 次のように言いましょう。

def find_something data
    if data.has_what_we_need?
        a = data.something
        if a.has_what_we_want?
            a.the_stuff[42]
        end
    end
end

次のようなもの (おそらくノイズが多い) とは対照的に:

def find_something data
    if data.has_what_we_need?
        a = data.something
        if a.has_what_we_want?
            a.the_stuff[42]
        else
            nil
        end
    else
        nil
    end
end
4

3 に答える 3

7

条件が満たされない場合に早期に救済されるメソッドを作成し、インデントに関してコードを平坦化しようとしています。

def find_something data
  return unless data.has_what_we_need?

  a = data.something

  return unless a.has_what_we_want?

  a.the_stuff[42]
end

これには明確に定義された 2 つの出口点があり、returnそれを読むとかなり明白なものとして現れるはずです。return引数のない a は、呼び出し元に戻りますnil

nilvsを気にしない場合は、falseこれをさらに凝縮できます。

def find_something data
  return unless data.has_what_we_need?

  a = data.something

  a.has_what_we_want? and a.the_stuff[42]
end
于 2013-10-18T16:03:02.197 に答える
2

これに関連する特定のイディオムは知りませんが、これが望ましいかもしれません:

def find_something data
    if data.has_what_we_need?
        a = data.something
        if a.has_what_we_want?
            return a.the_stuff[42]
        end
    end

    nil
end
于 2013-10-18T15:58:58.710 に答える
2

慣用的に、ルビーがデフォルトでメソッドから nil を返すことを意味する場合は、いいえ。

デフォルトでは、Ruby メソッドは最後に実行されたステートメントの値を返します。最後のステートメントが nil に解決された場合、メソッドは nil を返します。

あなたの例から、メソッドが見つかった場合は値を返し、見つからなかった場合は nil を返したいと想定しています。このようなものがうまくいくかもしれません:

def find_something (i)
    a = ['boris', 'natasha', 'moose' ,'squirrel']
    a[i]
end


irb(main):020:0> find_something 4
=> nil
irb(main):021:0> find_something 2
=> "moose"`

配列 a へのインデックスの結果が戻り値です。

お役に立てれば。

于 2013-10-18T16:15:30.540 に答える