什么定义了在实例化Ruby类时有多少个参数是有效的?
我正在复习Rails教程,看到了其中一部分是关于类的。以下是一个例子:什么定义了在实例化Ruby类时有多少个参数是有效的?,ruby,class,Ruby,Class,我正在复习Rails教程,看到了其中一部分是关于类的。以下是一个例子: class Word < String def palindrome? self == self.reverse end end # w = Word.new('madamimadam') # w.palindrome? #=> true 为什么我不能在SomeClass上给出参数“hello”,但我可以在Word上给出?我从未定义每个类接受或不接受一个参数 可选问题:为什么Word需要0到1个
class Word < String
def palindrome?
self == self.reverse
end
end
# w = Word.new('madamimadam')
# w.palindrome? #=> true
为什么我不能在SomeClass
上给出参数“hello”
,但我可以在Word
上给出?我从未定义每个类接受或不接受一个参数
可选问题:为什么Word需要0到1个参数?它的定义是什么
w2 = Word.new('hello', 'joe')
ArgumentError: wrong number of arguments (2 for 0..1)
在第二种情况下,如果不指定父类,则默认情况下父类是
对象
,它继承了它的,不带任何参数
在第一种情况下,将重写上述初始值设定项,以获取一个可选参数(即,您可以编写String.new
或String.new(“foo”)
)。(它还可以包含两个关键字参数,编码
和容量
,但这不是重点。)
如果要复制字符串的初始值设定项(一个可选的位置参数和一个可选的关键字参数),可以编写以下代码:
class MyString
def initialize(str="", encoding: nil, capacity: nil)
@encoding = str.encoding || Encoding::ASCII_8BIT
# ...
end
end
要定义需要多少个参数new
(如果使用三个参数定义Foo
上的initialize
,您将使用Foo.new(a,b,c)
实例化类)。在第二种情况下,如果不指定父类,则默认情况下父类是继承其,这不需要争论
在第一种情况下,将重写上述初始值设定项,以获取一个可选参数(即,您可以编写String.new
或String.new(“foo”)
)。(它还可以包含两个关键字参数,编码
和容量
,但这不是重点。)
如果要复制字符串的初始值设定项(一个可选的位置参数和一个可选的关键字参数),可以编写以下代码:
class MyString
def initialize(str="", encoding: nil, capacity: nil)
@encoding = str.encoding || Encoding::ASCII_8BIT
# ...
end
end
要定义需要多少个参数new
(如果您使用三个参数定义Foo
上的initialize
,您将使用Foo.new(a,b,c)
)实例化该类。只是一些术语注释:initialize
不是构造函数。Ruby中没有构造函数<代码>初始化
是一种与任何其他方法一样的方法。它通常由Class#new
调用,但这也是一种与其他方法一样的方法。Ruby最接近构造函数的是Class#allocate
方法(它也被Class#new
调用),但这也是一个普通的方法。@JörgWMittag:Meh。这是一个模糊的世界。称它为构造函数。另一方面,您是对的:“构造函数”作业可以分为“分配器”和“初始化器”,这是Ruby在引擎盖下通过调用allocate
和initialize
从new
,Objective-C通过[[Klass alloc]init]
显式执行的操作,Java隐藏了分配,并将初始值设定项调用为构造函数。更确切地说,改为“initializer”,但它和Java一样,也不愧为“构造函数”。在有一个称为“构造函数”的独特概念的语言中,构造函数是一个独特的概念。例如,在Java中,构造函数不是方法,它们与方法具有不同的分派语义,与方法具有不同的绑定语义,与方法具有不同的继承语义。它们是“特别的”。实际上,构造函数调用的JVM字节码被称为invokespecial
。在Ruby中,initialize
、allocate
和new
与其他方法一样。他们完全没有什么特别或不同之处。唯一的“奇怪”…事情是allocate
不能在没有扩展的标准Ruby中表达,因为它做的事情不是Ruby的一部分,特别是从对象空间分配内存并设置类指针。但这也不是特别的,Ruby中还有其他一些方法不能用标准Ruby来表达,比如Module#append#u features
、Module#prepend#features
、Module#private
、Module#public
、Module protected
、main::using
,Module#name
,以及几乎所有的反射方法。@JörgWMittag:我想我们只能同意不同意。在我的书中,构造函数的唯一要求是它是用OOP语言(特殊或非特殊)构造类(或原型)实例的主要方法。JavaScript构造函数也不是特别的,使它们成为构造函数的是使用new
操作符调用的,但是您仍然可以调用任何与new
构造函数一起使用的函数。JVM如何调用一个是一个实现细节。只是对术语的一些注释:initialize
不是构造函数。Ruby中没有构造函数<代码>初始化
是一种与任何其他方法一样的方法。它通常由Class#new
调用,但这也是一种与其他方法一样的方法。Ruby最接近构造函数的是Class#allocate
方法(它也被Class#new
调用),但这也是一个普通的方法。@JörgWMittag:Meh。这是一个模糊的世界。称它为构造函数。另一方面,您是对的:“构造函数”作业可以分为“分配器”和“初始化器”,这是Ruby在引擎盖下通过调用allocate
和initialize
从new
,Objective-C通过[[Klass alloc]init]
显式执行的操作,Java隐藏了分配,并将初始值设定项调用为构造函数。更确切地说,改为“initializer”,但它和Java一样,也不愧为“构造函数”。