関数が成功/失敗ステータスを返したい場合は、よくあります。
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
「自分は、こうやるよ!」などあれば、教えてください。