什么定义实例化Ruby类时有多少参数有效?

时间:2017-02-23 02:00:14

标签: ruby class

我正在审阅Rails教程书,并看到了它讨论类的一部分。这是一个例子:

class Word < String
  def palindrome?
    self == self.reverse
  end
end
# w = Word.new('madamimadam')
# w.palindrome? #=> true

这里我将'madamimadam'实例化为Word类到w变量。然后我运行palindrome?方法。

我尝试创建另一种方法

class SomeClass
  def some_method
    self.reverse
  end
end
# s = SomeClass.new('hello')
# ArgumentError: wrong number of arguments (1 for 0)

为什么我不能在"hello"上提供参数SomeClass,但我可以在Word上执行此操作?我从未定义过每个课程是否采取一个论点。

可选问题:为什么Word期望0到1个参数?它在哪里定义?

w2 = Word.new('hello', 'joe')
ArgumentError: wrong number of arguments (2 for 0..1)

1 个答案:

答案 0 :(得分:3)

在第二种情况下,在没有指定父类的情况下,父类默认为Object,它继承了initializer from BasicObject,它不带参数。

在第一种情况下,initializer was inherited from String会覆盖上面提到的初始值设定项,以便采用一个可选参数(即您可以编写String.newString.new("foo"))。 (它也可以使用两个关键字参数,encodingcapacity,但这不是重点。)

如果你想复制String的初始值设定项(一个可选的位置参数和一个可选的关键字参数),你可以这样写:

class MyString
  def initialize(str="", encoding: nil, capacity: nil)
    @encoding = str.encoding || Encoding::ASCII_8BIT
    # ...
  end
end

定义new需要多少个参数(如果在initialize上使用三个参数定义Foo,则可以使用Foo.new(a, b, c)实例化该类。