Ruby on rails 如何实施";“安全航行”-“兼容”;空对象模式";?
我喜欢空对象模式,例如Ruby on rails 如何实施";“安全航行”-“兼容”;空对象模式";?,ruby-on-rails,ruby,design-patterns,Ruby On Rails,Ruby,Design Patterns,我喜欢空对象模式,例如 类空地址 def详细信息;“尚未输入地址”;结束 def空白?;是的;结束 是否存在?;虚假的;结束 def nil?;是的;结束 结束 地址=NullAddress.new 但是我不知道(也没有发现什么东西)如何使这个&.-兼容: address&.city #=> NoMethodError: undefined method `city' for #<NullAddress:0x000055d3bbdeb7e8> 有什么提示吗?安全导航
类空地址
def详细信息;“尚未输入地址”;结束
def空白?;是的;结束
是否存在?;虚假的;结束
def nil?;是的;结束
结束
地址=NullAddress.new
但是我不知道(也没有发现什么东西)如何使这个&.
-兼容:
address&.city
#=> NoMethodError: undefined method `city' for #<NullAddress:0x000055d3bbdeb7e8>
有什么提示吗?安全导航操作符
&.
-它是Ruby 2.3.0中引入的安全导航操作符。如果被调用方是nil
,它基本上会返回nil
,而不是引发为nil类调用的未定义方法excecption。例如:
a = 1
a.next
# => 2
a&.next
# => 2
a = nil
a.next
# => NoMethodError (undefined method `next' for nil:NilClass)
a&.next
# => nil ## No exception, returns nil
安全导航操作符是ruby语法的一部分。它不是可以在代码中实现为方法的运算符
如果您仍然想摆脱NoMethodError
,那么您可以使用
def方法_缺失(m、*args和block)
无
结束
但这只是一个黑客
当您调用其他方法时,此实现可能会产生其他后果,您希望这些方法在address类上具有主题,但由于method\u缺失
您总是得到nil
比如address.location
将返回nil
,它应该抛出NoMethodError
我真的认为这是不可能的。无论调用的对象是什么,&.
操作符都将阻止Nomethoder错误。
a = 1
a.next
# => 2
a&.next
# => 2
a = nil
a.next
# => NoMethodError (undefined method `next' for nil:NilClass)
a&.next
# => nil ## No exception, returns nil