这是代码行:
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]
是什么[!!
意思,又是什么=~
意思?最后,整体线是什么意思?
这是代码行:
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]
是什么[!!
意思,又是什么=~
意思?最后,整体线是什么意思?
!!
是一个成语,意思是“将此值更改为布尔值”。第一个!
进行类型转换,第二个!
在保持布尔值的同时恢复语义。
不过,这在 ruby 中并不合适。我相信这是一个PHPism。
=~
是一个正则表达式匹配。
最后,整件事的意思是“如果 v 是一个 int 字符串,则将 v 设为整数类型并从哈希中获取,否则使用字符串作为键。”
The!!
是一个双重否定,一种用于将任何对象转换为true
或false
值的习语。
它之所以有效,是因为除此之外的任何对象false
并nil
评估为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]+$/
表达式返回的值(可以是任何对象)转换为true
或false
。然后将布尔值用作三元运算符的参数。
这意味着:如果字符串包含一个整数,则将其转换为 1,否则只返回该字符串。