4

我想做puts blob

但如果 blob 变量不存在,我会得到

NameError: undefined local variable or method `blob' for main:Object

我试过了

blob?  
blob.is_a?('String')
puts "g" if blob  
puts "g" catch NameError
puts "g" catch 'NameError'

但没有一个工作。

我可以通过使用@instance 变量来解决它,但这感觉像是在作弊,因为我应该知道并相应地处理没有价值的问题。

4

2 回答 2

13

在这种情况下,您应该这样做:

puts blob if defined?(blob)

或者,如果您也想检查 nil:

puts blob if defined?(blob) && blob

defined?方法返回一个字符串,表示参数的类型(如果已定义),nil否则。例如:

defined?(a)
=> nil
a = "some text"
=> "some text"
defined?(a)
=> "local-variable"

使用它的典型方法是使用条件表达式:

puts "something" if defined?(some_var)

更多关于defined?这个问题

于 2012-06-20T14:29:58.460 回答
0
class Object
  def try(*args, &block)
    if args.empty? and block_given?
      begin
        instance_eval &block
      rescue NameError => e
        puts e.message + ' ' + e.backtrace.first
      end
    elsif respond_to?(args.first)
      send(*args, &block)
    end
  end
end

blob = "this is blob"
try { puts blob }
#=> "this is blob"
try { puts something_else } # prints the service message, doesn't raise an error
#=> NameError: undefined local variable or method `something_else' for main:Object
于 2012-06-20T15:02:29.893 回答