当我需要一个空字符串(如果它为 nil)时,需要该静态方法 util_name 来防止 nil。
def self.util_name(value)
return '' if value.nil?
value.name
end
好的,鉴于那一点上下文,您可以Budget::util_name
完全删除该方法,因为它没有做任何有用的事情。有两种方法可以有条件地调用对象上的方法nil
,一种由框架提供,另一种由语言提供。
如果您使用的是 Ruby 2.2 或更早版本,请使用try 方法。
value.try(:name)
如果您使用的是 Ruby 2.3 或更高版本,则可以使用安全导航运算符
value&.name
无论哪种情况,您都不需要专门测试,nil
因为它会在插值时自动强制转换为空字符串。
"#{envelope_quantity&.name} - envelope #{envelope_size&.name} #{envelope_paper&.name} #{envelope_color&.name} #{envelope_grammage&.name} #{envelope_model&.name} #{envelope_print&.name}"
这更合理,但可能还是有点太长了。您可以使用字符串模板:
"%{quantity} - envelope %{size} %{paper} %{color} %{grammage} %{model} %{print}" % {
quantity: envelope_quantity&.name,
size: envelope_size&.name,
paper: envelope_paper&.name,
color: envelope_color&.name,
grammage: envelope_grammage&.name,
model: envelope_model&.name,
print: envelope_print&.name
}
但我想重点关注我注意到的关于此代码示例的一些内容。每个方法都以envelope
这可能意味着这些方法告诉您它们应该是一个单独的对象。如果您将这些数据提取到一个值对象中,那么这个辅助方法的自然位置就变得很明显了......
class Envelope < Struct.new(:quantity, :size, :paper, :color, :grammage, :model, :print)
def to_s
"#{quantity&.name} - envelope #{size&.name} #{paper&.name} #{color&.name} #{grammage&.name} #{model&.name} #{print&.name}"
end
end
毫无疑问,真正的代码会比这更复杂,只是值得深思。