方法

时间:2017-07-26 05:00:34

标签: ruby variables block

我得到以下不同的结果:

测试1:

def myblock
  x = 1
  y = 1
  yield(x)
  [x, y]
end

myblock do |x|
 y = 10
end
# => [1,1]

测试2:

x = 1
y = 1

1.upto(2) do |x|
  y = 20
end
[x,y]
# => [1,20]

块外部创建的变量可在块中使用。他们为什么这样?

3 个答案:

答案 0 :(得分:2)

这就是如何定义局部变量的范围。局部变量可以渗透到块中,但不能渗透到方法定义中。

答案 1 :(得分:1)

def myblock
  x = 1
  y = 1
  z = yield(x)
  puts "y=#{y}, z=#{z}"
  [x, y]
end

myblock do |x|
 y = 10
end
y=1, z=10
  #=> [1, 1]

这表明这里发生了三件事:

  • 广告块中的yy中的myblock无关。这是因为块中y的范围仅限于块。 Ruby只能接触块所返回的内容,而不是内部发生的内容。
  • 块确实在块中返回y的值,但仅仅因为y = 10是块中执行的最后一个语句。该语句的执行返回10,因此块返回10。如果该块包含y = 10; 7,则会返回7
  • yield(x)中的变量y未捕获myblock的值,因此无效。 1

1一个鲜为人知的事实是,Ruby实际上将这些价值观射入外太空。

答案 2 :(得分:0)

经过更多测试和搜索:

对于Test1,x和y是方法级局部变量,它们不与块共享作用域。块中的y是一个新的局部变量(块级别)。

对于Test2,x和y是类级局部变量,它们与块共享范围,块中的y仍然是外部y(类级别)。

这一切都是因为我搞砸了范围,谢谢大家。