1



私はルビーを学んでいて、おそらく単純な問題で立ち往生しています。コードがあります:

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

誰かがこれらの括弧が戻り値で何を変えるか教えてもらえますか?
それは一種のコードの「ブロック」ですか?

4

2 に答える 2

7

それらは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

これにより、割り当ては、割り当てられている値だけでなく、条件によって保護されているものであることが明確になります。

于 2013-02-10T14:16:38.683 に答える
0

括弧は、操作中に優先順位が変わります。括弧内のコードは、条件式としてのステータスによりブール値として評価されます。@Mark Reedが言ったように、異なるステートメントがあります。そして、正しいものを使用するのはあなたの意図次第です。それが役に立ったことを願っています。;)

于 2013-09-12T15:12:00.693 に答える