所以我都是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
所以我的问题是:下划线实际上是为了什么?它真的是一个不在乎变量还是别的什么?它的真名是什么?(因为我在谷歌上找不到很多"不在乎红宝石变量"的东西)
出你的是你看到下划线的两种不同用法。
在参数列表中,它就像一个"不关心变量",就像在Prolog中一样。
在参数列表之外,它只是一个普通的标识符。在 IRB 中,它绑定到上一个结果。由于您上次输入是
c = 3
的,_ 为 3。不过,这只在 IRB 中 — 它不会发生在普通的 Ruby 程序中。
- 在Ruby社区,
_
的意思是"不在乎"。 - 在 Ruby 语言中,
_
没有任何意义,它是一个标识符,就像任何其他标识符一样。 - 在YARV Ruby解释器中,"未使用的局部变量"警告被抑制了
_
,因此将约定编码为#1。 - 在 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