不幸的是,我收到以下错误。我不太明白为什么它不起作用?
:14:in `convert': undefined method `factors' for 30:Fixnum (NoMethodError)
from question_stack.rb:18:in `<main>'
我尝试创建以下类:
# Class Wordgame
class Wordgame
WORDGAME_MAP = {
'3' => 'baa',
'5' => 'bar',
'7' => 'bla'
}.freeze
def self.factors
(1..self).select { |n| (self % n).zero? }
end
def self.convert(number)
number.factors.map(&:to_s).each.map { |char| WORDGAME_MAP[char] }.join
end
end
Wordgame.convert(30)
我做错了什么?我的心理错误在哪里?
最佳答案
self
在类方法中指类本身,或在实例方法中指当前对象。在您的情况下,它指的是对象的类 WordGame
。
如果您确实希望它在 factors
方法中引用 30
,您必须将其定义为实例方法,因为在对象上调用 (30
),而不是一个类(Integer
),打开Integer
类
class Integer
def factors
(1..self).select { |n| (self % n).zero? }
end
end
我想你知道替代方案:
def self.factors(x)
(1..x).select { |n| (self % n).zero? }
end
def self.convert(number)
factors(number).map(&:to_s).each.map { |char| WORDGAME_MAP[char] }.join
end
或者更好的是,使用 OOP。
class WordGame
def initialize(n)
@n = n
end
def convert
factors.map(&:to_s).each.map { |char| WORDGAME_MAP[char] }.join
end
private
def factors
(1..@n).select { |m| (@n % m).zero? }
end
end
Wordgame.new(30).convert
关于ruby 类未定义方法 (NoMethodError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47612539/