如何确保ruby中的方法具有特定类型

如何确保ruby中的方法具有特定类型,ruby,Ruby,您可能知道,ruby和大多数脚本语言一样,是动态类型的。如何确保传递给我的方法的参数是特定类的实例?使用is\u a?: def your_method(param) if param.is_a? String # it's a string else # not a string end end 或者,如果要检查的类很多,则使用case语句: def your_method(param) case param when

您可能知道,ruby和大多数脚本语言一样,是动态类型的。如何确保传递给我的方法的参数是特定类的实例?

使用
is\u a?

def your_method(param)
    if param.is_a? String
        # it's a string
    else
        # not a string
    end
end
或者,如果要检查的类很多,则使用
case
语句:

def your_method(param)
    case param
    when String
        # it's a string
    when Array
        # it's an array
    when Rational
        # it's a rational
    # ...
    else
        # it's not any of these classes
    end
end

使用
是否是一个?

def your_method(param)
    if param.is_a? String
        # it's a string
    else
        # not a string
    end
end
或者,如果要检查的类很多,则使用
case
语句:

def your_method(param)
    case param
    when String
        # it's a string
    when Array
        # it's an array
    when Rational
        # it's a rational
    # ...
    else
        # it's not any of these classes
    end
end

由调用方提供正确类型的参数。在Ruby中,如果使用不支持类型的参数调用方法,则通常会引发
ArgumentError
。例如:

def do_something_with_a_number(number)
  raise ArgumentError, "you have to provide a number" unless number.is_a?(Fixnum)
  ...
end

由调用方提供正确类型的参数。在Ruby中,如果使用不支持类型的参数调用方法,则通常会引发
ArgumentError
。例如:

def do_something_with_a_number(number)
  raise ArgumentError, "you have to provide a number" unless number.is_a?(Fixnum)
  ...
end
检查它的类型

那么,为什么呢?一般来说,你应该关注它的低调,而不是它的类型。当某种东西与它的类型而不是它的消息绑定时,我通常会怀疑。

检查它的类型


那么,为什么呢?一般来说,你应该关注它的低调,而不是它的类型。当某件事与它的类型而不是它的消息相关时,我通常会产生怀疑。

+1。具体来说,
parameter.response\u to?(:method\u i\u want)
parameter.is\u a?(ClassIWant)
更可取。错误检查。假设您的方法调用一个字符串,而某个愚蠢的程序员传递了一个数字。强类型语言不可能,Runy、PHP或Python等语言也可能。@DariuszG.Jagielski我不明白你想说什么。我说要检查它的类型,但同样,最好检查它的接口。具体来说,
parameter.response\u to?(:method\u i\u want)
parameter.is\u a?(ClassIWant)
更可取。错误检查。假设您的方法调用一个字符串,而某个愚蠢的程序员传递了一个数字。强类型语言不可能,Runy、PHP或Python等语言也可能。@DariuszG.Jagielski我不明白你想说什么。我说要检查它的类型,但还是要检查它的接口。谢谢。‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​谢谢‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​‌​