Ruby “x,y”和“x”之间的区别是什么;y=0 | `红宝石?

Ruby “x,y”和“x”之间的区别是什么;y=0 | `红宝石?,ruby,Ruby,在使用block编写代码时,我试图理解管道内部的局部变量创建(|)。在我的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; pri

在使用block编写代码时,我试图理解管道内部的局部变量创建(
|
)。在我的
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>'

;y
用于处理Ruby的作用域(隐藏外部变量),并且不接受值,因为它位于
|

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

从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}

从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}

我知道,但我的问题是
有什么区别;y=0
;y
内部
|
。请看我的最新描述。这是Ruby所禁止的。我知道,但我的问题是
之间有什么区别;y=0
;y
内部
|
。查看我的更新描述。这是Ruby所禁止的。请查看我的更新。那么为什么我们能够初始化
|
中的数组对象呢?请看我的答案,您可以为参数块设置默认值,而不是
|
之间的局部变量块。这就是为什么你的最后一个例子是有效的。好的!这意味着
method
也是block,它允许默认值语法,但匿名block不允许。我不明白。你所说的
方法是什么意思?我的意思是块参数可以有一个默认值,比如
|x=0,y=1 |
,但是本地块参数不能初始化为值
|x;y=1 |
无效。请查看我的更新。那么为什么我们能够初始化
|
中的数组对象呢?请看我的答案,您可以为参数块设置默认值,而不是
|
之间的局部变量块。这就是为什么你的最后一个例子是有效的。好的!这意味着
method
也是block,它允许默认值语法,但匿名block不允许。我不明白。你所说的
方法是什么意思?我的意思是块参数可以有一个默认值,比如
|x=0,y=1 |
,但是本地块参数不能初始化为值
|x;y=1 |
无效。