18

これは一般的なパターンです。変数が存在しない場合、undefined local variable or methodエラーが発生します。

既存のコードにはありますがif variable_name.present?、これは存在しない変数を考慮していません。

変数の値を確認し、変数がまったく存在しないことを説明するにはどうすればよいですか?

私はもう試した:

if (defined? mmm) then
  if mmm.present? then
    puts "true"
  end
end

しかし、Rubyはそれでもその内部をチェックし、mmm.present?存在しない場合は「そのような変数はありません」をスローします。

これには共通のパターン/解決策があると確信しています。

4

2 に答える 2

28

最初の式が true の場合にのみ 2 番目の式を評価しようとする && 演算子をに変更しpresent?て使用します。!= ''

if defined?(mmm) && (mmm != '') then puts "yes" end

しかし、実際には2019年以降、以下の両方が機能するため、これは不要になりました

irb(main):001:0> if (defined? mm) then
irb(main):002:1* if mm.present? then
irb(main):003:2* p true
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> if (defined? mm) then
irb(main):007:1* p mm
irb(main):008:1> end
=> nil
于 2012-08-24T13:27:52.520 に答える
4

Ruby on Railsについて

if defined?(mm) && mm.present?
  puts "acceptable variable"
end

IRBで

if defined?(mm) && !mm.blank? && !mm.nil?
  puts "acceptable variable"
end

未定義の変数、nil、または空の値を取得しないようにすることができます。

defined?仕組みを理解する

a = 1
defined?(a) # => "local-variable"

b = nil
defined?(b) # => "local-variable"

c = ""
defined?(c) # => "local-variable"

d = []
defined?(d) # => "local-variable"

$e = 'text'
defined?($e) # => "global-variable"

defined?(f) # => nil
defined?($g) # => nil

defined?スコープ内の変数をチェックすることに注意してください。

必要な理由defined?

未定義の変数が存在する可能性がある場合.nil?、eaxample だけでチェックするだけではなく、NameError が発生する可能性があります。

a = nil
a.nil? # => true
b.nil? # => NameError: undefined local variable or method `b'
于 2016-06-05T06:47:29.950 に答える