1. nao58

    Posted

    nao58
Changes in title
+[Ruby] メソッドが結果のブール値とエラーステータスを返したい場合のプラクティス
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,72 @@
+
+関数が成功/失敗ステータスを返したい場合は、よくあります。
+
+```ruby
+def test_method
+ true
+end
+result = test_method
+#=> result: true
+```
+
+失敗時にエラーに関する情報を戻したい場合も、ままあるかと。
+
+```ruby
+def test_method
+ return false, {msg: 'something wrong', count: 999, target: 'database'}
+end
+result, err_status = test_method
+#=> result: false
+#=> err_status: { ... }
+```
+
+ただ、こうやって書いてしまうと、ステータスが不要な場合にも呼び出し側が受け取らなければならず、面倒。更にブール値が戻ってくることを期待していると配列が返ってくるので、事故りやすい。
+
+```ruby
+def ok?
+ return false, {msg: 'NG!'}
+end
+"OK!" if ok?
+#=> "OK!"
+```
+
+ステータスが欲しい場合に別メソッドで取得する形もあるけど、ステータスを保存しておいたり、何か気に喰わない。
+
+```ruby
+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!"
+```
+
+どうしようか悩んだけど、ブロックを使うと比較的スッキリ扱えるような気がした。
+
+```ruby
+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
+```
+
+ステータス不要な場合には、普通に使えば良い。
+
+```ruby
+"OK!" if ok?
+#=> nil
+```
+
+「自分は、こうやるよ!」などあれば、教えてください。