【问题标题】:Define conditions on a method's parameter在方法的参数上定义条件
【发布时间】:2016-04-10 19:13:47
【问题描述】:

我有一个方法只接受一个参数:

def my_method(number)

end

如果使用number < 2 调用该方法,我该如何引发错误? 通常,如何在方法的参数上定义条件?

比如我想调用的时候报错:

my_method(1)

【问题讨论】:

  • 不能在参数定义中直接放入这样的约束。您可以检查方法主体的第一行:raise :whatever if number < 2
  • @ndn,我不敢苟同。请看我的回答。

标签: ruby methods


【解决方案1】:

您可以在函数开头添加guard,如果参数无效则引发异常。例如:

def my_method(number)
    fail ArgumentError, "Input should be greater than or equal to 2" if number < 2

    # rest of code follows
    # ...
end

# Sample run
begin
  my_method(1)
rescue => e
    puts e.message
end
#=> Input should be greater than or equal to 2

如果您不想使用ArgumentError,可以定义custom exception


如果您正在构建类似框架的东西,那么您可以利用元编程技术来拦截方法调用并应用一些验证。请参阅Executing code for every method call in a Ruby module。您可能必须想出某种 DSL 来表达这些验证 - 验证 DSL 的典型示例是 Rails 中的Active Record Validations

总之,对于日常用例,简单的raise (or fail) 和rescue 就足够了。只有在构建通用框架时才需要元编程和基于 DSL 的验证。

【讨论】:

  • 你不必调用new,只需传递异常类和消息,即raise ArgumentError, "Input should be ..."(或根据Ruby风格指南fail
  • @Stefan 非常感谢。我更新了代码。感谢您在各种帖子中留下的投入。
【解决方案2】:

你必须检查条件并在方法体中提出它。没有您想要的内置选项。

【讨论】:

    【解决方案3】:

    你可以这样做:

    def my_method arg, dummy = (raise ArgumentError, "arg < 2" if arg < 2) 
      puts "arg=#{arg}"
    end
    my_method 3
      # arg=3
    my_method 1
      # ArgumentError: arg < 2
    

    【讨论】:

    • 不...卡里...你知道这只是邪恶的。 (:
    • @ndn,根据我的经验,邪恶的答案经常被忽视。
    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多