ruby – 基于一个属性的不区分大小写的equals方法
发布时间:2020-12-17 02:35:24 所属栏目:百科 来源:网络整理
导读:原始问题 这是一个非常可怕的方法,它根据代码检查相等性,但不区分大小写 def ==(another_country) (code.nil? ? nil : code.downcase) == (another_country.code.nil? ? nil : another_country.code.downcase) unless another_country.nil?end 你能指出我正
原始问题
这是一个非常可怕的方法,它根据代码检查相等性,但不区分大小写 def ==(another_country) (code.nil? ? nil : code.downcase) == (another_country.code.nil? ? nil : another_country.code.downcase) unless another_country.nil? end 你能指出我正确的方向如何写这个更优雅的w / o reliying丑陋的if else结构? 这是我最终使用的解决方案(RSpecs) # Country model class Country < ActiveRecord::Base attr_accessible :code def ==(another_country) code.to_s.downcase == another_country.code.to_s.downcase rescue false end end 广泛的测试: # RSpec describe Country do describe 'equality based solely on Country.code' do before do @country_code_de = FactoryGirl.build(:country,:code => 'de') end it 'should be equal if Country.code is equal' do other_country_code_de = FactoryGirl.build(:country,:code => 'de') @country_code_de.should == other_country_code_de end it 'should be not equal if Country.code is not equal' do country_code_usa = FactoryGirl.build(:country,:code => 'usa') @country_code_de.should_not == country_code_usa end it 'should be case insensitive' do country_code_de_uppercase = FactoryGirl.build(:country,:code => 'DE') @country_code_de.should == country_code_de_uppercase end it 'should not rely on id for equality' do @country_code_de.id = 0 country_code_usa = FactoryGirl.build(:country,:code => 'usa',:id => 0) @country_code_de.should_not == country_code_usa end it 'should be not equal if Country.code of one Country is nil' do country_code_nil = FactoryGirl.build(:country,:code => nil) @country_code_de.should_not == country_code_nil end it 'should be equal if Country.code for both countries is nil' do country_code_nil = FactoryGirl.build(:country,:code => nil) other_country_code_nil = FactoryGirl.build(:country,:code => nil) country_code_nil.should == other_country_code_nil end it 'should be not equal if other Country is nil' do @country_code_de.should_not == nil end it 'should be not equal if other object is not a Country' do @country_code_de.should_not == 'test' end it 'should be equal for descendants of Country with same Country.code' do class CountryChild < Country end country_child = CountryChild.new(:code => 'de') @country_code_de.should == country_child end end end 解决方法
这个怎么样,
def ==(another_country) return false if code.blank? # Remove this line if you want to return true if code and antoher_country.code are nil code.to_s.downcase == another_country.to_s.code.downcase rescue false end 这里如果有任何代码,another_country或another_country.code为nil,它将通过异常并且rescue false语句将返回false值. 如果一切顺利,将进行比较,并根据输入返回true或false. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 每次在property getter中返回新的ICommand是不是很糟
- c# – List.Enumerator的Reset方法的行为
- PostgreSQL 按拼音排序 - convert to GBK/EUC_CN coding
- c# – 如何在类似太空侵略者的游戏中执行子弹/敌方矩形碰撞
- 关于vector迭代器失效的几种情况总结
- XML文本转为MAP对象的简便方法(利用jackson-dataformat-xm
- PostgreSQL在CentOS上没有服务名称
- reactjs – 使用Redux-Form与React-Redux连接时的TypeScrip
- 好与坏,Swift 语言面面观(二)
- ruby-on-rails – 如何使用omniauth google oauth2获取rail