我在写一些代码来评估一串字符串的存在,并且我想确保只有1个存在。它们是互斥的。寻找更好的与字符串逻辑异或解决方案
class MyClass
include ActiveModel::Validations
attr_accessor :a, :b, :c
validate :mutex_values
def initialize(attr = {})
attr.each do |k, v|
send("#{k}=", v)
end
end
private
def mutex_values
# here, I want to do this:
# errors.add(:base, "specify only 1") unless a^b^c
# instead I do this
errors.add(:base, "specify only 1") unless a.present?^b.present?^c.present?
end
end
MyClass.new(:a => "A", :b => "B", :c => "C").valid?
=> false
是否有另一种方法不需要重复使用.present?
? Monkey patch字符串来定义一个运算符^
?我只是习惯于能够做到if a
,感觉不自然需要什么基本上是显式转换为布尔值。我觉得这个用例会在Ruby中“正常工作”。
这个问题没有明确说明,但我相信问题在于他正在寻找空字符串,表现得像是null(falsey)。 – numbers1311407
我真的在寻找一个与字符串一起使用的逻辑异或运算符。我很好地把''“'算作真实的,因为它意味着客户端设置(或试图)。我在这个问题中使用了'present?',因为我知道''''''''变成'true'的唯一方法是使用'!!',但是会引发警告。 –
Ruby中的字符串是真实的,不需要将它们转换为布尔值。唯一的falsey值是null(可能是用户没有设置属性时),并且为false。 –