Regex 空正则表达式文本的Double not(!!//)为false,这是解析错误吗?
在Ruby中,只有Regex 空正则表达式文本的Double not(!!//)为false,这是解析错误吗?,regex,ruby,Regex,Ruby,在Ruby中,只有false和nil是false;其他一切都是真实的。可以使用两个not操作符检查对象的真实性: !!假#假 !!零#假 !![]没错 !!{}没错 !!'' # 真的 !!0#对 但后来我发现空正则表达式literal/是错误的,但作为一个变量,它是真实的!: !!/#假的! 不假 x=// x、 类#正则表达式 !!对 我认为这是解析器的一个怪癖。我怎么能问解析器它在做什么呢?老实说,我不是100%确定,但我的想法是Ruby在运行时正在做下一件事!!x put!
false
和nil
是false;其他一切都是真实的。可以使用两个not
操作符检查对象的真实性:
!!假#假
!!零#假
!![]没错
!!{}没错
!!'' # 真的
!!0#对
但后来我发现空正则表达式literal/
是错误的,但作为一个变量,它是真实的!:
!!/#假的!
不假
x=//
x、 类#正则表达式
!!对
我认为这是解析器的一个怪癖。我怎么能问解析器它在做什么呢?老实说,我不是100%确定,但我的想法是Ruby在运行
时正在做下一件事!!x
put!!/#这是一个幻影。匹配(nil),如下所示,因此返回false
x=//
放!!x、 比赛(零)
这不仅适用于空正则表达式文本,而且适用于所有正则表达式文本
!!/(.*)/
=> false
x = /(.*)/
!!x
=> true
起初,这似乎是regexp构造方式的一个问题
!!Regexp.new('')
=> true
x = Regexp.new('')
!!x
=> true
!!//.freeze
=> true
但深入挖掘,这似乎是原因:
!!//
=> false
$_ = 'b'
!!//
=> true
将“$”设置回零将重置结果。$的值是从Kernel.readline
或Kernel.get
设置的。在新控制台中:
Kernel.readline
a
"a\n"
!!//
=> true
因此,实例化带有/
的Regexp对象似乎与$的值相匹配,这并不能解释放置的原因!!x
打印true
以及为什么put/
不打印false
//代码>做一个!!匹配数据,但是!!x
做了一个!!Regexp
。这就是我的想法。”因此,用/
实例化一个Regexp对象似乎与$的值相匹配,这似乎是正确的,因为在$之后,='b'
/b/
也是如此。