1

这是代码行:

options[:selectors] = [[1, "Spain"], [2, "Italy"]]
v = "Monthly"

value = Hash[options[:selectors]][!!(v =~ /^[0-9]+$/) ? v.to_i : v]

我不确定的主要部分是最后一行的这一部分:

[!!(v =~ /^[0-9]+$/) ? v.to_i : v]

是什么[!!意思,又是什么=~意思?最后,整体线是什么意思?

4

2 回答 2

5

!!是一个成语,意思是“将此值更改为布尔值”。第一个!进行类型转换,第二个!在保持布尔值的同时恢复语义。

不过,这在 ruby​​ 中并不合适。我相信这是一个PHPism。

=~是一个正则表达式匹配。

最后,整件事的意思是“如果 v 是一个 int 字符串,则将 v 设为整数类型并从哈希中获取,否则使用字符串作为键。”

于 2012-07-14T02:01:58.010 回答
1

The!!是一个双重否定,一种用于将任何对象转换为truefalse值的习语。

它之所以有效,是因为除此之外的任何对象falsenil评估为true. 否定对象产生false,否定结果返回true

object = Object.new

not object
# => false

not not object
# => true

如果我们试图否定nil,我们得到true,如果我们试图否定那个结果,我们得到false

object = nil

not object
# => true

not not object
# => false

编码:

!!(v =~ /^[0-9]+$/) ? v.to_i : v

v =~ /^[0-9]+$/表达式返回的值(可以是任何对象)转换为truefalse。然后将布尔值用作三元运算符的参数。

这意味着:如果字符串包含一个整数,则将其转换为 1,否则只返回该字符串。

于 2012-07-14T02:10:07.363 回答