这行代码是什么意思? !哈希[]里面

时间:2012-07-14 01:52:58

标签: ruby-on-rails ruby

以下是代码行:

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]

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

2 个答案:

答案 0 :(得分:5)

!!是一个习惯用法,意思是“将此值更改为布尔值”。第一个!执行类型转换,第二个!使语义恢复,同时保持布尔值。

但是,这在红宝石中并不合适。我相信这是一种PHP主义。

=~是正则表达式匹配。

最后,整个事情意味着“如果v是一个int字符串,则使v为整数类型并从散列中获取,否则使用该字符串作为键。”

答案 1 :(得分:1)

!!是一个双重否定词,用于将任何对象转换为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。然后将布尔值用作ternary operator的参数。

表示:如果字符串包含整数,则将其转换为1,否则只返回字符串。