Ruby "don't care variable"和 Prolog 的一样吗?



所以我都是Prolog和Ruby的新手。在大学学习Prolog,在我自己的学校学习Ruby。我在想Ruby中是否有像Prolog中那样的"不在乎"或"trowaway"变量。

我刚刚打开irb并做了这个(假设下划线是"不在乎"标志)

1.9.2-p290 :003 > _, b, c = [1,2,3]
 => [1, 2, 3] 
1.9.2-p290 :004 > b
 => 2 
1.9.2-p290 :005 > c
 => 3 

结果实际上是我所期望的。但后来我很好奇下划线的值在哪里,它是什么类

1.9.2-p290 :006 > _
 => 3 
1.9.2-p290 :008 > _.class
 => Fixnum 

嗯,这很奇怪。难道不应该把价值拖走吗?为什么要存储其他值?

然后用下划线做更多的测试,我看到了它实际上发生了什么,它具有最后一个评估值。

1.9.2-p290 :017 > 1
 => 1 
1.9.2-p290 :018 > _
 => 1 
1.9.2-p290 :019 > "string"
 => "string" 
1.9.2-p290 :020 > _
 => "string" 
1.9.2-p290 :021 > Hash
 => Hash 
1.9.2-p290 :022 > _
 => Hash 

所以我的问题是:下划线实际上是为了什么?它真的是一个不在乎变量还是别的什么?它的真名是什么?(因为我在谷歌上找不到很多"不在乎红宝石变量"的东西)

出你的是你看到下划线的两种不同用法。

  1. 在参数列表中,它就像一个"不关心变量",就像在Prolog中一样。

  2. 在参数列表之外,它只是一个普通的标识符。在 IRB 中,它绑定到上一个结果。由于您上次输入是 c = 3 的,_ 为 3。不过,这只在 IRB 中 — 它不会发生在普通的 Ruby 程序中。

  1. 在Ruby社区_的意思是"不在乎"。
  2. 在 Ruby 语言中,_没有任何意义,它是一个标识符,就像任何其他标识符一样。
  3. 在YARV Ruby解释器中,"未使用的局部变量"警告被抑制了_,因此将约定编码为#1。
  4. IRb 中,_绑定到最后一个表达式的值。

Ruby 中的下划线就像任何普通变量一样,只是它比这更特别一些。它确实代表"我不在乎"。

例如,假设您正在循环访问一个数组,该数组的元素是 3 元素数组:

array = [[1,2,3],[4,5,6],[7,8,9],...]

假设您只对中间值感兴趣。使用_您可以执行以下操作:

array.each do |_, number, _|
  # do something
end

如果您尝试使用另一个变量执行此操作,您将收到(预期)错误,指出您复制了一个变量:

array.each do |v, number, v|
  # do something
end
=> SyntaxError: (eval):2: duplicated argument name

最新更新