3

たとえば、これには4行かかりますが、このような単純な操作にはスペースが大きすぎます。

if something_is_true
  puts 'error'
  return
end

これはワンライナーですが、ぎこちなく見えます。

if something_is_true; puts 'error'; return; end

私たちは次のようなことをすることができますか

# it would be great if this would work because it is short and readable
puts 'error' and return if something_is_true
4

6 に答える 6

7

元のコードが「多すぎる」ほどスペースが貴重だと思う理由がわかりません。コードに余裕を持たせ、必要なスペースを確保します。「スペースを節約する」ためにトリッキーになりすぎるのは、誤った経済です。最も重要なことは、コードが読みやすく理解しやすいことです。あなたの元のコードは私には素晴らしく見えます。

于 2012-07-05T01:03:17.797 に答える
4

私は@NedBatchelderに同意します。あなたの元のコードがおそらく最高です。他の人は、あなたの特定の例では、を使用できると指摘していますreturn puts 'error'

それでも、学習のために、複数のステートメントを括弧でグループ化できるため、他の方法では1つしか使用できない場所で少数のステートメントを使用できます。あなたが言った:

# it would be great if this would work because it is short and readable
puts 'error' and return if something_is_true

これは次の方法で実行できます。

(puts 'error'; return) if something_is_true
于 2012-07-05T01:54:53.577 に答える
1

この特定のケースでは、値がないと;returnが返されます。nilこれはたまたまの戻り値でもあるためputs、次のようにするだけで同じ効果を得ることができます。

return puts "error" if something_else
于 2012-07-05T01:46:19.650 に答える
1

これはちょっとひどいですが、putsはnilを返すので、うまくいくと思います。

puts 'error' || return if something_else
于 2012-07-05T01:04:14.033 に答える
0

いつの日か、1行のコードで何サイクルを費やすことができるかについてはあまり気にしないでしょう。ブロックはシンプルで明確なので、私はブロックを使用しif-endます...ご存知のとおり、それが目的です。

于 2012-07-05T01:06:35.610 に答える
0

ステートメントの結合には絶対に使用しないことをお勧めし;ます。判読できない傾向があります。しかし、それでも他のアプローチがあります。2つのアイデアです。最初の1つは、参加error(msg, return_value = nil)して、return

return(error("Message")) if something_is_true

return(error("Message", value_to_be_returned)) if something_is_true

2つ目は、Rubyでは、例外を使用して問題を通知するのが慣用的であるため、この完全に慣用的なワンライナーを作成できます。

raise MyException.new("human explanation of the error") if condition

課題で使用されたのと同じアイデア:

link = doc.at_css(".content a.link") or raise MyException.new("msg")
于 2012-07-05T07:13:47.897 に答える