4

所以我对 Prolog 和 Ruby 都很陌生。在大学学习 Prolog,在我自己学习 Ruby。我在想 Ruby 中是否像 Prolog 中那样存在“不关心”或“丢弃”变量。

我刚打开 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 

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

4

3 回答 3

10

让你震惊的是,你看到了下划线的两种不同用法。

  1. 在参数列表中,它就像在 Prolog 中的“无关变量”。

  2. 在参数列表之外,它只是一个普通的标识符。在 IRB 中,它绑定到先前的结果。由于您的最后一个输入是c = 3,所以 _ 是 3。不过,这仅在 IRB 中 - 它不会发生在普通的 Ruby 程序中。

于 2012-05-05T17:36:48.007 回答
9
  1. 在 Ruby社区中,_表示“不在乎”。
  2. 在 Ruby语言中_没有任何意义,它是一个和其他任何标识符一样的标识符。
  3. 在 YARV Ruby解释器中,“未使用的局部变量”警告被抑制_,因此在 #1 中编码了约定。
  4. IRb中,_绑定到最后一个表达式的值。
于 2012-05-06T13:03:22.090 回答
5

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
于 2012-11-29T16:54:44.580 回答