Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何实施";“安全航行”-“兼容”;空对象模式";?_Ruby On Rails_Ruby_Design Patterns - Fatal编程技术网

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