2012-06-22 9 views
22

In Groovy gibt es eine nette Syntax für die Arbeit mit Nullwerten.Hat Ruby Syntax für sichere Navigation Operator von Null-Werten, wie in Groovy?

Zum Beispiel kann ich eine if-Anweisung tun:

if (obj1?.obj2?.value) { 

} 

Dies wird nicht eine Nullpointer werfen, auch wenn obj1 null ist (es wird auf falsch bewerten).

Das ist etwas, das sehr praktisch ist, also frage mich, ob es ein Ruby-Äquivalent gibt, das ich vermisst habe.

+2

http://stackoverflow.com/questions/8805582/is-there-an-equivalent-null-prevention- on-chained-attracts-of-groovy-in-ruby –

+0

danke! Habe auch gerade den andand edel gefunden, der versucht diesen Ruby durch eine Methode einzuführen: http://weblog.raganwald.com/2008/01/objectandand-objectme-in-ruby.html –

+0

Noch nicht in einer stabilen Version, aber Der Entwicklungszweig von Ruby hat jetzt den '.?' Operator. Siehe https://bugs.ruby-lang.org/issues/11537?utm_source=rubyweekly&utm_medium=email#note-12 –

Antwort

23

In einer Rails-Anwendung gibt es Object#try

So können Sie

tun
obj1.try(:obj2).try(:value) 

oder mit einem Block (wie auf Kommentare sagte unten)

obj.try {|obj| obj.value} 

UPDATE

In Rubin 2.3 gibt es o perator hierfür:

obj&.value&.foo 

, die die gleiche ist wie obj && obj.value && obj.value.foo

+3

Oder alternativ: 'obj.try {| obj | obj.value} '- Block-Modus macht oft mehr visuelle Sinn IMHO. –

+0

Diese Block-Syntax macht am meisten Sinn, wenn Sie etwas mit dem Wert tun möchten, wie eine Methode darauf aufrufen. –

+0

Ein übliches Muster, um diese Art von Problem anzugehen, sind [Nullobjekte] (http://robots.thoughtbot.com/post/20907555103/rails-refactoring-example-introduce-null-object). –

2

try war der einzige Weg, dies Standard 2.3 vor Rubin zu tun. Mit 2,3 Rubin können Sie tun:

if obj1&.obj2&.value 

end 

Auch, wenn Sie eine Hash-Struktur haben, können Sie den _. Operator mit Hashie verwenden:

require 'hashie' 
myhash = Hashie::Mash.new({foo: {bar: "blah" }}) 

myhash.foo.bar 
=> "blah"  

myhash.foo? 
=> true 

# use "underscore dot" for multi-level testing 
myhash.foo_.bar? 
=> true 
myhash.foo_.huh_.what? 
=> false 
+0

Also, versuch * war * der einzige Weg, dies zu tun als ich die Frage beantwortete. Das &. Notation wurde gerade mit Ruby 2.3 hinzugefügt. Der Downvote war nicht wirklich notwendig, ein Kommentar oder eine Bearbeitung wäre geschätzt worden. –

+0

Nicht sicher, ob Ihr Downvote verwandt war, aber ich habe gerade eine Änderung vorgenommen, weil Sie JavaScript-Syntax für Ihre if-Anweisung verwendet haben. – jeremywoertink