4

匿名ブロックとハッシュ ブロックはほぼ同じように見えます。私はそれで遊んでいました。そして、私は以下のようないくつかの深刻な観察に達しましたか?

{}.class
#=> Hash

わかりました、それはクールです。空のブロックは と見なされHashます。

print{}.class
#=> NilClass
puts {}.class

#=> NilClass

上記のコードは と同じNilClassですが、下のコードはHash再び を示しているのはなぜですか?

puts ({}.class)
#Hash
#=> nil
print({}.class)
#Hash=> nil

1つ上で何が起こっているのかを理解するために、誰かがここで私を助けることができますか?

私は@Lindydancerのポイントに完全に同意しません

以下の行をどのように説明しますか。

print {}.class
#NilClass
print [].class
#Array=> nil
print (1..2).class
#Range=> nil

print [].class以下と同じではないのはなぜprint (1..2).classですか?

編集

local variableand呼び出しであいまいさが発生するとmethod、Ruby は以下のような事実についてエラーをスローします。

name
#NameError: undefined local variable or method `name' for main:Object
#        from (irb):1
#        from C:/Ruby193/bin/irb:12:in `<main>'

現在、同じことは起こりません(またはブロック{}の間にあいまいさがあるため)。ここでも IRB として、それがかかどうかはわかりません。では、IRB が発生したときにエラーがスローされなかったのはなぜですか?empty code blockHashempty blockHashprint {}.class{}.class

4

3 に答える 3

6

ruby make の優先順位規則は とprint{}.class解釈し(print{}).classます。print明らかに a を返すように、nilメソッドclassは を返します#NilClass

編集:他の回答や質問の更新で説明されているようにprint{}もちろんprint、ハッシュではなくブロックで呼び出していると解釈されます。ただし、これは{}バインドが[]and(1..2)よりも強い (さらに言えばよりも強いdo ... end) ため、依然として優先順位に関するものです。

于 2013-03-11T12:59:27.063 に答える
3

{}この場合、 は に渡されたブロックとして認識されますがprint[]明確に空の配列を意味します。

print {}.class                            # => NilClass
print do;end.class                        # => NilClass
于 2013-03-11T13:09:37.393 に答える
1

コンテキストに応じて文字の意味が異なる、Ruby のいくつかのニュアンスに出くわしています。ソース コードがどのように解釈されるかは規則に従います。その 1 つは、メソッド呼び出しに続く場合{}はクロージャ ブロックであり、そうでない場合はハッシュ コンストラクタです。

ステートメント内の文脈や位置に応じて、文字が異なるものを意味することは言語全体で一般的です。


例:

()メソッド呼び出しまたは優先順位のために使用される括弧

print(1..5).class => NilClass
print (1..5).class => Range <returns nil>

[]メソッドの呼び出し:[]または配列に使用される角括弧

print[].class => NoMethodError: undefined method `[]' for nil:NilClass
print([].class) => Array <returns nil>

*乗算またはスプラッティングに使用されるアスタリスク

1 * 5 => 5
[*1..5] => [1, 2, 3, 4, 5]

シンボルに使用されるアンパサンド&-> proc または論理 and

0 & 1 => 0
[1, 2, 3].map(&:to_s) => ["1", "2", "3"]

またはあなたの場合、ブロッククロージャーまたはハッシュに使用されるブレース

... hope it makes sense now ...
于 2013-03-11T21:19:42.063 に答える