2011-01-22 65 views
0

Rubyには、VB.NETの "OrElse"や "AndAlso"に似た演算子がありますか?私が行うことができますVB.netで"OrElse"と "AndAlso"(Rubyの同等演算子)

if active_record.nil? || active_record.errors.count == 0 
    ... 
end 

If active_record Is Nothing OrElse active_record.errors.count = 0 
    ... 
End 

それので、例外を発生させないactive_recordがnilのときのRuby NoMethodError例外では例えば

が発生します最初の式のみがチェックされます

+0

実際のライブラリ、またはactive_recordオブジェクトのコードでは 'active_record'ですか?この例では –

+0

です。active_recordは、何も指定できないオブジェクトです。 – Sebtm

+0

あなたのフレーズを撫でた理由はわかりません。最後の1つについては、VB.NETでは2番目の式が最初にfalseになった場合にのみ評価されます。 [これは短絡操作です](http://en.wikipedia.org/wiki/Short-circuit_evaluation)、Ruby '&&'& '||'でも同じことが起こります。 –

答えて

3

この場合も例外はありませんed(||の最初の項のみであるため)評価されます)。しかし、ActiveSupportからObject#tryについて読むことに興味があるかもしれません。これは、無関係なオブジェクトを扱う際に役立ちます。

+0

あなたはそうです。私のコードに問題がありました。最初の項のみが評価されます。 – Sebtm

+1

問題は何ですか? –

1

Ruby ||short circuit evaluationです。したがって、最初の条件のみを評価する必要があります。したがって、ifは例外を発生しません。

active_record.nil?はブール値trueを返します。

1

ルビーでは、nilと定義されていないものに大きな違いがあります。 IRBから、次のことを考慮すると:

ruby-1.9.2-p0 :002 > active_record 
NameError: undefined local variable or method `active_record' for main:Object 
    from (irb):2 
    from /Users/jed/.rvm/rubies/ruby-1.9.2-p0/bin/irb:16:in `<main>' 
ruby-1.9.2-p0 :003 > active_record = nil 
=> nil 
ruby-1.9.2-p0 :004 > active_record.class 
=> NilClass 
ruby-1.9.2-p0 :006 > active_record.nil? 
=> true 

ので、nilであるオブジェクトはNilClassのインスタンスされているため、メッセージnil?に応答trueを返しますが、(あなたのコードのように)変数を宣言せずになるRubyのdoesnのは、あなたが何を呼んでいるのか分からない。

ここではオプションのカップル:

orキーワードはあまり厳密であるのに対し、Rubyの||オペレータは、厳格な作業なので、VBの操作は、これら2つのまたはフローのオプションとの比較どこ私は知りません。

あなたはcallled小ぎれいな宝石を使用することができます「andand

require 'andand' 
active_record.andand.errors.count == 0 

しかし、あなたがレールにこのような状況に対処する際に、一般的に、あなたが考える、上記の状況を判断するために、別の手段を使用します。

@post = Post.new(:my_key => "my value") #=> an ActiveRecord object 
if @post.valid? 
    # do something meaningful 
else 
    puts @post.errors.full_messages.to_sentence 
end 

、あなたはそれ未定義である可能性が高い場合に基づいて、何かを割り当てることを意味する場合は、メモ化を使用するとよいでしょう:

@post ||= Post.new 

未定義の場合はオブジェクトを宣言するか、既存のオブジェクトを使用します