Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么定义了在实例化Ruby类时有多少个参数是有效的?_Ruby_Class - Fatal编程技术网

什么定义了在实例化Ruby类时有多少个参数是有效的?

什么定义了在实例化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个

我正在复习Rails教程,看到了其中一部分是关于类的。以下是一个例子:

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一样,也不愧为“构造函数”。