私はルビーを学んでいて、おそらく単純な問題で立ち往生しています。コードがあります:
str = 'abc'
a = 1
b = 2
a = str.reverse if str.size > 3
b = (str.reverse if str.size > 3)
p a
p b
出力:
1
nil
誰かがこれらの括弧が戻り値で何を変えるか教えてもらえますか?
それは一種のコードの「ブロック」ですか?
私はルビーを学んでいて、おそらく単純な問題で立ち往生しています。コードがあります:
str = 'abc'
a = 1
b = 2
a = str.reverse if str.size > 3
b = (str.reverse if str.size > 3)
p a
p b
出力:
1
nil
誰かがこれらの括弧が戻り値で何を変えるか教えてもらえますか?
それは一種のコードの「ブロック」ですか?
それらは2つの異なるステートメントです。
最初のものは条件付き割り当てです:
a = str.reverse if str.size > 3
はif
ライン全体に適用されます。が3以下の場合str.size
、まったく何も起こりません。a
全く触れられていません。次のように書くこともできます。
if str.size > 3 then
a = str.reverse
end
端に貼り付けることができるのでif
、ブロックではなく1行でそれを行うことができます。
2つ目は、条件値の割り当てです。
b = (str.reverse if str.size > 3)
この場合、の値はb
、何があっても常に変更されます。の値は、str.size
何に変更されるかを決定します。if
ここのブロック形式を使用することもできます。
b = if str.size > 3 then
str.reverse
end
重要な違いは、への割り当てb
がの外部if
で行われるため、条件付きではないことです。それは常に起こります。
括弧はブロックを作成しませんが、優先順位を決定します。物事が発生する順序に応じて複数の方法で解釈できるステートメントがある場合は常に、実際に何が発生するかは優先順位ルールによって決定されます。たとえば、標準の算術規則は、これが正しいことを示しています。
3 + 2 × 4 = 11
乗算は加算よりも優先されるため、答えは20ではありません。括弧を使用すると、それを変更できます。上記は同等です
3 + (2 × 4) = 11
答えを20にしたい場合は、代わりに次のように書くことができます。
(3 + 2) × 4 = 20
同じことがRubyにも当てはまります。括弧がない場合、最初の行はこの括弧で囲まれたバージョンと同等です。
(a = str.reverse) if str.size > 3
これにより、割り当ては、割り当てられている値だけでなく、条件によって保護されているものであることが明確になります。
括弧は、操作中に優先順位が変わります。括弧内のコードは、条件式としてのステータスによりブール値として評価されます。@Mark Reedが言ったように、異なるステートメントがあります。そして、正しいものを使用するのはあなたの意図次第です。それが役に立ったことを願っています。;)