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#=>零