Jör*_*tag 259
就像Ruby中的所有其他方法一样(或者实际上几乎任何面向对象的语言),
a === b
Run Code Online (Sandbox Code Playgroud)
意味着无论a班级作者想要什么意思.
但是,如果你不想混淆你的同事,那么惯例是包含运算符===的情况.基本上,它是一个布尔运算符,它问一个问题" 如果我有一个标记的抽屉a,放入b那个抽屉是否有意义? "
另一种表述是" 如果a描述一组,那将b是该组的成员吗? "
例如:
(1..5) === 3 # => true
(1..5) === 6 # => false
Integer === 42 # => true
Integer === 'fourtytwo' # => false
/ell/ === 'Hello' # => true
/ell/ === 'Foobar' # => false
Run Code Online (Sandbox Code Playgroud)
===运算符的主要用法是case表达式,因为
case foo
when bar
baz
when quux
flurb
else
blarf
end
Run Code Online (Sandbox Code Playgroud)
被翻译成某种东西(粗略地)
_temp = foo
if bar === _temp
baz
elsif quux === _temp
flurb
else
blarf
end
Run Code Online (Sandbox Code Playgroud)
请注意,如果要搜索此运算符,通常将其称为三重等于运算符或三元运算符或大小写等于运算符.我真的不喜欢这些名字,因为这个运算符绝对没有任何与平等有关的东西.
特别是,人们会期望相等是对称的:如果a等于b,那么b最好也等于a.此外,人们所期望的平等是传递的:如果a == b和b == c,然后a == c.虽然没有办法真正保证在像Ruby的单牒的语言,你至少应该作出努力,保持这种特性(例如,通过下面的coerce协议).
但是,因为===没有对称性或传递性的期望.事实上,它非常依赖于设计而不是对称的.这就是为什么我不喜欢叫它什么,甚至远程类似于平等.这也是为什么我认为它应该被称为其他类似的~~~东西.
小智 6
感谢您的编辑雅各布,我打算叫你出去;)无论如何,我会发布一些例子.===的实现因类型而异.例如:
(1...3) === 2
=> true
/test/ === "this is a test"
=> true
case 'test'
when /blah/
"Blach"
when /test/
"Test"
else
"Fail"
end
=> "Test"
Run Code Online (Sandbox Code Playgroud)
斯蒂芬,结帐http://ruby-doc.org/docs/ProgrammingRuby/("镐头"),它应该能够在将来帮助你解决这个问题.
| 归档时间: |
|
| 查看次数: |
45611 次 |
| 最近记录: |