3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

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

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?