Help us understand the problem. What is going on with this article?

[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

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

nao58
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away