0

|在使用块编写代码时,我试图了解 pipe() 内的局部变量创建。并且在我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>'

但是无法理解第二个代码发生了什么,而第一个代码是完美的。

谁能告诉我两者的区别|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 未初始化,因此它没有任何值。从语法上讲,您不能| |像在第二个示例中那样直接在管道之间初始化局部块变量。这只是被禁止的。

但是,在 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

;y用于解决 Ruby 的作用域(隐藏外部变量),并且不接受值,因为它在内部||

于 2013-03-11T10:25:13.623 回答