Ruby

[Ruby] メソッドが結果のブール値とエラーステータスを返したい場合のプラクティス

More than 5 years have passed since last update.

関数が成功/失敗ステータスを返したい場合は、よくあります。

def test_method

true
end
result = test_method
#=> result: true

失敗時にエラーに関する情報を戻したい場合も、ままあるかと。

def test_method

return false, {msg: 'something wrong', count: 999, target: 'database'}
end
result, err_status = test_method
#=> result: false
#=> err_status: { ... }

ただ、こうやって書いてしまうと、ステータスが不要な場合にも呼び出し側が受け取らなければならず、面倒。更にブール値が戻ってくることを期待していると配列が返ってくるので、事故りやすい。

def ok?

return false, {msg: 'NG!'}
end
"OK!" if ok?
#=> "OK!"

ステータスが欲しい場合に別メソッドで取得する形もあるけど、ステータスを保存しておいたり、何か気に喰わない。

class TestClass

def ok?
@err_status = {msg: 'NG!'}
false
end
def last_err_status
@err_status
end
end
x = TestClass.new
x.last_err_status unless x.ok?
#=> "NG!"

どうしようか悩んだけど、ブロックを使うと比較的スッキリ扱えるような気がした。

def ok?

err_status = {msg: 'NG!'}
yield err_status if block_given?
false
end
result = ok? do |err_status|
p err_status[:msg]
end
#=> "NG!"
#=> reuslt: false

ステータス不要な場合には、普通に使えば良い。

"OK!" if ok?

#=> nil

「自分は、こうやるよ!」などあれば、教えてください。