ruby Class.new(arg).method等效于Class.method(arg)

时间:2017-06-06 16:53:48

标签: ruby

我有一个类,它包含一个基于类实例返回计算的方法。

class Foo
  def initialize(arg)
    @arg = arg
  end

  def baz
    @arg.dosomething
  end
end

是否可以重新格式化,以便调用Foo.new(bar).baz等于Foo.baz(bar)

2 个答案:

答案 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

可能还有其他方法可以完成工作,但这似乎是一种简单而明确的方法,可以证明是有效的。