在Ruby中,==和===之间有什么区别?该RDoc的说
Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写以在case语句中提供有意义的语义.
是#==一样的==吗?你能举例说明在case语句中何时/如何使用它?
我不知道我是只是在寻找错误的东西或者是什么,但是有一种简单的方法来评估范围并使用(2..100)语法检查整数是否在该范围内.
例如,如果我的整数x = 100和我的范围是(0..200),我想要评估为真,我只是在寻找简单,简洁的红宝石方式.
在Ruby中Integer === 5返回true.同样String === "karthik"回报true.
但是,5 === Integer退货false.并且"karthik" === String.
为什么操作员不能交换?
我正在使用Ruby的case语法来设置一些基于self.class如下的简单逻辑:
case self.class
when FirstClass
do stuff....
when SecondClass
do other stuff...
end
Run Code Online (Sandbox Code Playgroud)
我很快意识到这总是回归nil.经过仔细调查,我发现case使用===而不是==检查平等.当self.class == FirstClass我在我的终端中运行时,我得到true了预期,但self.class === FirstClass返回false.
展望红宝石文档,我发现了以下的解释的===:
Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写,以在case语句中提供有意义的语义.
谁可以在那里揭示可能发生的事情?提前致谢.
我是Ruby的新手,我正在努力解决一些困扰我的问题.在编写一个简单的解析器时,我发现将char与a进行比较==会产生与将其与case表达式进行比较不同的结果:
File.open('Quote.txt') do |f|
f.chars.each do |c|
puts c == '"' ? 'Quote' : 'Err'
puts case c
when '"' then 'QuoteCase'
else 'ErrCase'
end
p c == '"', c === '"', c
end
end
Run Code Online (Sandbox Code Playgroud)
假设Quote.txt是一个包含单引号字符(0x22)的1字节文件,这会产生:
Quote
ErrCase
true
true
"\""
Run Code Online (Sandbox Code Playgroud)
我假设我做错了什么,但我无法弄清楚它是什么.有人可以帮忙吗?
顺便说一句,这是在Ruby 1.9.2中.
这事实上TypeOfClass === TypeOfClass是false给我的印象是反直觉.在以下代码中,即使field.class是同一个类,它的计算结果为false:
case field.class
when Fixnum, Float
field + other_field
when Date, DateTime, Time
field
else
puts 'WAT?'
end
Run Code Online (Sandbox Code Playgroud)
我这样做了:
Fixnum === Fixnum # => false
Class === Class # => true
Run Code Online (Sandbox Code Playgroud)
我发现另一个线程:
Integer === 3 # => true
Fixnum === 3 # => true
3.class # => Fixnum
Run Code Online (Sandbox Code Playgroud)
我找不到这种语言设计的原因.语言设计师在这种行为中思考的是什么?
我认为这与另一个帖子中提供的答案有关.假设Numeric === Integera Integer是一种更具体的类型,这并不是不自然的Numeric.但是,它不是:
Numeric === Integer #=> false
Run Code Online (Sandbox Code Playgroud)
我认为case陈述或 …