在函数声明中定义变量类型Ruby

在函数声明中定义变量类型Ruby,ruby,Ruby,如何在函数定义中声明变量类型 在下一个代码中: def f(a, b) #... end 我可以忘记它是用什么类型的。我如何声明它是一个fixnum?感谢有关什么是真正的“类型”的澄清,请参见评论和其他答案 如何测试“变量的类型”(在Ruby中,每个变量都引用一个对象,我们不讨论类型,只讨论类) 如何测试一个类: variable = MyClass.new variable.class # => "MyClass" variable.is_a?(MyClass) # => tru

如何在函数定义中声明变量类型

在下一个代码中:

def f(a, b)
#...
end

我可以忘记它是用什么类型的。我如何声明它是一个fixnum?感谢

有关什么是真正的“类型”的澄清,请参见评论和其他答案

如何测试“变量的类型”(在Ruby中,每个变量都引用一个对象,我们不讨论类型,只讨论类)

如何测试一个类:

variable = MyClass.new
variable.class # => "MyClass"
variable.is_a?(MyClass) # => true
但通常在Ruby中,我们更感兴趣的是对象能做什么,我们能用它们做什么:

if variable.respond_to?(increment)
  variable.increment
else
  raise "Error : must provide as 'variable' an object that can increment itself"
end
现在回答您的问题,我将使用rdoc语法“声明”函数定义/注释中的行为

# Description of f
# Params:
# +a+:: command line string to be executed by the system
# +b+:: +Proc+ object that ....
def f(a, b)
  # code
end

你的问题中有两点令人困惑:

  • Ruby中的变量没有类型。只有对象可以

  • Fixnum
    不是类型,而是类。类不是类型。协议是一种类型。任何说出正确协议的对象都属于同一类型。Ruby中一些没有相应类或mixin的著名协议示例就是我将称之为可追加的协议(由名为
    Ruby的方法组成的)类型很弱。变量在实例化时确实有一个类类型,但您可以自由地将它们重新分配给另一个变量类型。存储此信息的唯一方法是在函数的文档中。@sagarpandya82:是的,完全正确。在OO中,对象的类型(或者更确切地说是类型)是协议Ruby中的一个很好的例子是
    StringIO
    库中的
    StringIO
    类。
    StringIO
    的实例应该在
    IO
    的任何地方都可以使用。
    StringIO
    的目的是为了“假”由常规字符串而不是文件、网络套接字、管道等支持的IO对象)因此,
    IO
    StringIO
    的实例具有相同的类型,但它们除了
    Object
    之外不共享任何公共类。想想看:Liskov替换原理告诉我们何时允许一种类型成为另一种类型的子类型。
    S…和
    t
    的超类型,这反过来意味着
    S
    T
    是同一类型。这种“协议”的概念最初是在Smalltalk中开发的。然而,在Smalltalk中(就像在Ruby中一样),它是非正式的,并且只存在于文档中。(在Smalltalk中,它通常也内置在IDE中。)当Brad Cox和Tom Love在1982年基于Smalltalk设计Objective-C时,他们将这种非正式的协议思想作为语言的一部分。当Patrick Nouton等人基于Objective-C设计Java时,他们保留了协议的思想,但将其重命名为
    interface
    s。在Java中,
    interface
    s定义对象类型,而reas
    class
    es定义抽象数据类型。因此,如果您将Java纯粹用作面向对象的语言,那么您不应该将类用作类型,而只使用接口。Java的接口概念相当于Ruby的协议概念。Ruby中只有极少数地方需要特定的类。通常,这是b因为在这种特殊的情况下,Ruby出于性能原因而放弃了面向对象的原则。但即使在那些非常特殊的情况下,Ruby也提供了一个转义图案:它不要求对象属于某个类,而只要求它为该类实现某个转换协议。例如,传递一段代码就像它是一个块一样,Ruby需要一个
    Proc
    对象。但是你不必传递
    Proc
    ,你也可以传递返回的东西…