2

私は現在、次のようなコードを持つプロジェクトに取り組んでいます。

  # the first return is the one causing problems
  def collect
    return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]] unless @ident_a_node.nil? and @id.nil?
    return Hash["IdentANode", @id] unless @id.nil?
  end

条件付きで return ステートメントを実行するために、unless 演算子を使用します。何らかの理由で、このコードは isであって実行されます。実行すると、次のメッセージが表示されます。@ident_a_nodenil

IdentANode.rb:14:in collect': undefined methodcollect' for nil:NilClass (NoMethodError)

これは私を混乱させます。なぜなら、unless キーワードがこれを防ぐと思っていたからです。ステートメントを次の形式に変更すると、次のようになります。

if not @ident_a_node.nil? and not @id.nil?
  return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]]
end  

またはこのフォーム:

return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]] if not @ident_a_node.nil? and not @id.nil?

return ステートメントは実行されません。これら 2 つのステートメントに違いがあるのはなぜですか? unlessキーワードに複数の条件があると問題が発生しますか?

任意のアイデアをいただければ幸いです

4

2 に答える 2

5

そこに論理障害があります。どちら かが. nil_ _ nil否定の層が多すぎるために、おそらくこの状況に陥っています。複数のものは受け入れられません。

つまり、「雨が降っていない場合」は問題ありませんが、「is_not_rainingフラグが false の逆に設定されていない限り」などは使用しないでください。

私の個人的な意見では、存在することが明らかでない限り、後続条件は使用すべきではありません。例でわかるように、水平方向にスクロールして条件を見つける必要があり、開発者から重要な情報が隠されています。

スタイルの問題として、同じ仕事をするnotwhen will は使用しないでください。第二に、おそらく何らかの定義済みの値が必要な場合に!特にテストしています。nil

他の問題には、それらを必要とする言語を使用することの確かな成果物である使用がHash[]含まれます。Ruby は、JavaScript と同様に、それぞれとArray[]を使用してこれらを暗黙的に宣言できます。{ }[ ]

コードの適切な Ruby スタイル バージョンは次のとおりです。

if (@ident_a_node and @id)
  return { "IdentANode" => [ @id, ",", @ident_a_node.collect ] }
end  
于 2012-06-21T17:48:41.407 に答える
2

and/or 以外では使用しないでください。単に紛らわしいだけです。unless @ident_a_node.nil? and @id.nil?つまりif !(@ident_a_node.nil? and @id.nil?)、2 つのインスタンス変数のいずれかが nil でない場合はいつでも返されます。

if !(@ident_a_node.nil? and @id.nil?)

と同じです

if !@ident_a_node.nil? or !@id.nil?

なぜそれが同じではないのか、さらに明確にする必要があります

if not @ident_a_node.nil? and not @id.nil?
于 2012-06-21T17:44:51.930 に答える