0

|ブロックでコードを書くときにパイプ内のローカル変数の作成を理解しようとしていました。また、IRB以下のコードでも同じことを試しました。

[1,2,3].each {|x;y| y=x; print y}

#123=> [1, 2, 3]
[1,2,3].each {|x;y = 0| y=x; print y}

#SyntaxError: (irb):1: syntax error, unexpected '=', expecting '|'
#[1,2,3].each {|x;y = 0| y=x; print y}
                    ^
#(irb):1: syntax error, unexpected '}', expecting $end
#        from C:/Ruby193/bin/irb:12:in `<main>'

しかし、最初のコードは完璧ですが、2番目のコードで何が起こったのか理解できませんでした。

の違いを教えてください|x,y| and |x;y=0|。この質問に対する答えが私にとって意味があることを願っています。

再び以下は完全に機能します:

a = "hello world".split(//).each{ |x,newstr = Array.new() | newstr = x.capitalize;puts newstr }

#H
#E
#L
#L
#O
#
#W
#O
#R
#L
#D
#=> ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]
4

2 に答える 2

4

Ruby 1.9以降では、ブロックパラメータからローカル変数をで区切ることにより、ブロック内のローカル変数;を宣言することができます。この例でxは、はブロックパラメータであり、yはローカル変数です。次のコードはそれをよく示しています。

> [1,2,3].each {|x; y| puts "x: #{x} - y: #{y}"}
x: 1 - y: 
x: 2 - y: 
x: 3 - y:
 => [1, 2, 3]

yは初期化されていないため、値はありません。構文的には、2番目の例のように、パイプ間でローカルブロック変数を直接初期化することはできません| |。それはただ禁じられています。

ただし、Ruby 1.9では、ブロックパラメータのデフォルト値を設定できます。それはそう、

> [1,2,3].each {|x,y=0| puts "x: #{x} - y: #{y}"}
x: 1 - y: 0
x: 2 - y: 0
x: 3 - y: 0
 => [1, 2, 3]

構文的に正しいです。今回yはデフォルト値のブロックパラメータです0。次のように違いを説明できます。

> { one: 1, two: 2, three: 3}.each {|x,y=0| puts "x: #{x} - y: #{y}"}
x: one - y: 1
x: two - y: 2
x: three - y: 3
 => {:one=>1, :two=>2, :three=>3}
于 2013-03-11T10:38:09.720 に答える
1

;yRubyのスコープ(外部変数のシャドウイング)を回避するために使用され、内部にあるため値を受け入れません||

于 2013-03-11T10:25:13.623 に答える