我正在审阅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)
答案 0 :(得分:3)
在第二种情况下,在没有指定父类的情况下,父类默认为Object
,它继承了initializer from BasicObject
,它不带参数。
在第一种情况下,initializer was inherited from String
会覆盖上面提到的初始值设定项,以便采用一个可选参数(即您可以编写String.new
或String.new("foo")
)。 (它也可以使用两个关键字参数,encoding
和capacity
,但这不是重点。)
如果你想复制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)
实例化该类。