Ruby内置迭代器中的额外块变量做什么?
假设您使用的是内置迭代器Ruby内置迭代器中的额外块变量做什么?,ruby,Ruby,假设您使用的是内置迭代器。范围上的每个方法: (0..3).each do |x,y,z,a,b,c| end 我知道x是集合中的实际项,但是为块定义额外的块变量(y,z,a,b,c)实际上做了什么?它们代表什么吗 如果该方法未给出值,则附加变量将为零。 运行时: (0..3).each do |x,y| puts x.class.to_s() + ' ' + y.class.to_s() end 它输出: Integer NilClass Integer NilClass Inte
。范围上的每个方法:
(0..3).each do |x,y,z,a,b,c|
end
我知道x是集合中的实际项,但是为块定义额外的块变量(y,z,a,b,c
)实际上做了什么?它们代表什么吗 如果该方法未给出值,则附加变量将为零。
运行时:
(0..3).each do |x,y|
puts x.class.to_s() + ' ' + y.class.to_s()
end
它输出:
Integer NilClass
Integer NilClass
Integer NilClass
Integer NilClass
这完全取决于该方法发送的内容:
def myBlockCaller
yield 1, 2, 3
yield 'a', '5'
yield true
yield nil, 1
end
myBlockCaller do |x, y, z|
puts x.class.to_s() + ', ' + y.class.to_s() + ', ' + z.class.to_s()
end
显示:
Integer, Integer, Integer
String, String, NilClass
TrueClass, NilClass, NilClass
NilClass, Integer, NilClass
如果该方法不提供值,则附加变量将为零。
运行时:
(0..3).each do |x,y|
puts x.class.to_s() + ' ' + y.class.to_s()
end
它输出:
Integer NilClass
Integer NilClass
Integer NilClass
Integer NilClass
这完全取决于该方法发送的内容:
def myBlockCaller
yield 1, 2, 3
yield 'a', '5'
yield true
yield nil, 1
end
myBlockCaller do |x, y, z|
puts x.class.to_s() + ', ' + y.class.to_s() + ', ' + z.class.to_s()
end
显示:
Integer, Integer, Integer
String, String, NilClass
TrueClass, NilClass, NilClass
NilClass, Integer, NilClass
他们什么都不“做”。如果你尝试一下,你会发现它们是零
(0..3).each do |x,y,z,a,b,c|
puts x.inspect
puts y.inspect
puts z.inspect
puts a.inspect
puts b.inspect
puts c.inspect
end
1
nil
nil
nil
nil
nil
2
nil
nil
nil
nil
nil
3
nil
nil
nil
nil
nil
有些迭代器使用多个变量,如每个带有索引的变量:
(1..3).each_with_index do |n,i|
n
将保存范围项,i是其索引,即0,1,2
或者以类似以下的散列形式:
{a: 1, b: 2, c: 3}.each do |k,v|
puts k
puts v
end
a:
1
b:
2
c:
3
他们什么都不“做”。如果你尝试一下,你会发现它们是零
(0..3).each do |x,y,z,a,b,c|
puts x.inspect
puts y.inspect
puts z.inspect
puts a.inspect
puts b.inspect
puts c.inspect
end
1
nil
nil
nil
nil
nil
2
nil
nil
nil
nil
nil
3
nil
nil
nil
nil
nil
有些迭代器使用多个变量,如每个带有索引的变量:
(1..3).each_with_index do |n,i|
n
将保存范围项,i是其索引,即0,1,2
或者以类似以下的散列形式:
{a: 1, b: 2, c: 3}.each do |k,v|
puts k
puts v
end
a:
1
b:
2
c:
3
有时方法会注意你的块的“arity”,有时他们只是不在乎。在这种情况下,每个
都不重要。散列#每个
都是一个有趣的例子。这看起来可能会产生两个论点,但事实上并非如此。它产生一个参数,数组[k,v]
,然后它被“解构”,就像你做的那样,比如说,x,y=[1,2]
@tadman,你确定吗?我一直明白方法确实关心参数的算术性,而块则不关心。@steenslag方法确实关心,块可能取决于它们的声明方式。有时方法检查块的算术性并表现出不同的行为,有时它们总是以相同的方式调用,而不管如何,声明正确数量的变量是您的责任。方法也可以通过执行*args
等操作来“不关心”它们将接受给定的任何内容。有时方法会关注块的“arity”,有时它们只是不关心。在这种情况下,每个
都不重要。散列#每个
都是一个有趣的例子。这看起来可能会产生两个论点,但事实上并非如此。它产生一个参数,数组[k,v]
,然后它被“解构”,就像你做的那样,比如说,x,y=[1,2]
@tadman,你确定吗?我一直明白方法确实关心参数的算术性,而块则不关心。@steenslag方法确实关心,块可能取决于它们的声明方式。有时方法检查块的算术性并表现出不同的行为,有时它们总是以相同的方式调用,而不管如何,声明正确数量的变量是您的责任。方法也可以通过执行*args
等操作来“不在乎”它们将在何处获取它们所提供的任何内容。我忘记了是谁告诉我这一点,这样我可以对它们给予赞扬,但块就像过程一样,它们不检查参数的数量,而lamba就像方法一样。创建了一个枚举器:enum=(0..3).each#=>#
。然后生成枚举数的第一个元素并将其传递给块:n=enum.next#=>0
。最后,将块变量设置为与传递给块的元素相等,并使用消歧法将值分配给前者:x,y,z=n;x#=>0;y#=>零;z#=>nil
。我忘了是谁告诉我这一点的,所以我可以给他们评分,但是块就像进程一样,它们不检查参数的数量,而lamba就像方法一样。创建了一个枚举器:enum=(0..3)。每个#=>
。然后生成枚举数的第一个元素并将其传递给块:n=enum.next#=>0
。最后,将块变量设置为与传递给块的元素相等,并使用消歧法将值分配给前者:x,y,z=n;x#=>0;y#=>零;z#=>零
。