【问题标题】:Ruby - how can I deal with a variable if it doesn't existRuby - 如果变量不存在,我该如何处理它
【发布时间】:2012-06-22 17:12:29
【问题描述】:

我想做puts blob

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

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 变量来解决它,但这感觉像是在作弊,因为我应该知道并相应地处理没有价值的问题。

【问题讨论】:

  • 在不确定变量是否存在的情况下,你在做什么令人讨厌的魔法?
  • 我在 Rails 中编程,我想确保我的方法可以处理防御性编程模式中不存在的变量
  • 请解释可能发生这种情况的逻辑场景。

标签: ruby


【解决方案1】:

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

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?this question的信息。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 非常类似于ActiveSupport中的Object#tryapi.rubyonrails.org/classes/Object.html#method-i-try
    • 是的,但我认为我的版本更方便。
    • 也许吧,但顾名思义,它比仅捕获NameError 实际要通用得多。像try {1/0} 这样的事情仍然会失败,所以恕我直言,对于 OP 的请求来说太多了,而对于通用解决方案来说太少了。
    • 请告诉我更多关于通用解决方案的信息,因为我要为尝试构建 gem(它将是 tryit)。我不知道如何开始聊天。
    • 好吧,捕获的错误不仅仅是NameError。此外,您可能希望能够实现不同的错误处理策略,而不仅仅是使用puts
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2022-10-31
    • 1970-01-01
    相关资源
    最近更新 更多