我有一个类,它包含一个基于类实例返回计算的方法。
class Foo
def initialize(arg)
@arg = arg
end
def baz
@arg.dosomething
end
end
是否可以重新格式化,以便调用Foo.new(bar).baz
等于Foo.baz(bar)
?
答案 0 :(得分:3)
是否可以重新格式化,以便调用
Foo.new(bar).baz
等于Foo.baz(bar)
?
有两种不同的方法可以实现这一目标。一个看起来像这样:
def baz
self.class.baz(@arg)
end
def self.baz(arg)
arg.dosomething
end
当计算不依赖于任何其他实例方法或属性时,这是有意义的。请在repl.it上查看:https://repl.it/I8m6/1
或者,您可以通过调用new
使类方法创建实例并调用实例方法:
def self.baz(arg)
new(arg).baz
end
但是,我认为这通常是一个反模式:你只是为了调用一个方法创建一个实例然后扔掉它。我不推荐这个,但你可以在repl.it上看到它:https://repl.it/I8m6
答案 1 :(得分:0)
[我]只是练习拼字游戏,但练习提示要求它返回分数,如果称为Scrabble.new(单词).score或Scrabble.score(单词)。
您的X / Y问题的关键在于您自己的comment,如上所述。最简单的解决方案是确保实例方法始终调用类方法。例如:
class Scrabble
def initialize word=nil
@word = word
end
def score
self.class.score @word
end
def self.score word
"Class method: #{word.inspect}"
end
end
Scrabble.new('foo').score
#=> "Class method: foo"
Scrabble.score('foo')
#=> "Class method: foo"
Scrabble.new('foo').score == Scrabble.score('foo')
#=> true
可能还有其他方法可以完成工作,但这似乎是一种简单而明确的方法,可以证明是有效的。