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