在使用块编写代码时,我试图理解管道内的局部变量创建(|
)。并且在我的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"]
答案 0 :(得分: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}
答案 1 :(得分:1)
;y
用于解决Ruby的范围(阴影外部变量),并且不接受值,因为它位于||