ruby:如何用参数初始化类方法?

ruby:如何用参数初始化类方法?,ruby,Ruby,我正在努力解决一个简单的问题:如何用参数实例化一个类。 例如,我有一个带有初始值设定项的类,该初始值设定项接受两个参数和一个类方法: class MyClass attr_accessor :string_1, :string_2 def initialize(string_1, string_2) @string_1 = string_1 @string_2 = string_2 end def self.some_method # do s

我正在努力解决一个简单的问题:如何用参数实例化一个类。 例如,我有一个带有初始值设定项的类,该初始值设定项接受两个参数和一个类方法:

class MyClass
  attr_accessor :string_1, :string_2

  def initialize(string_1, string_2)
    @string_1 = string_1    
    @string_2 = string_2
  end

  def self.some_method
    # do something
  end

end
如果某个方法是实例方法,我可以实例化MyClass的新对象并调用实例方法,如下所示:

MyClass.new("foo", "bar").some_method
但是对于MyClass本身和class方法,而不是实例,我如何实现这一点呢

类似于MyClass.self(“foo”,“bar”)。某些方法不起作用。

您可以这样做

class MyClass
  singleton_class.send(:attr_accessor, :string_3)
end

MyClass.string_3 = "It's a fine day."
MyClass.string_3 #=> "It's a fine day."

@string\u 3
是一个类实例变量。

我认为启动类然后对这些值运行方法的传统方法如下:

class MyClass
  def initialize(string_1, string_2)
    @string_1 = string_1
    @string_2 = string_2
  end

  def some_method
    "#{@string_1} #{@string_2}"
  end
end

a = MyClass.new("foo", "bar")
puts a.some_method #=> "foo bar"
如果要使用attr\u访问器,则可以绕过some\u方法返回这些值:

class MyClass 
  attr_accessor :string_1, :string_2
  def initialize(string_1, string_2)
    @string_1 = string_1
    @string_2 = string_2
  end
end

a = MyClass.new("foo", "bar")
puts a.string_1 + a.string_2 #=> "foobar"

类并不是真正用来保存状态的。这是实例的工作。因此,如果您希望类方法
some\u方法
对某些数据起作用,通常的做法是将这些数据作为参数传递:
def self.some\u方法(string\u 1,string\u 2)
。你想达到什么目标?如果你控制着这个类,我建议把
some_method
作为一个实例方法。感谢你的详细介绍,我只是想知道是否可能有一个与MyClass相对应的方法。新的(“foo”,“bar”)。一些类级的_方法。我想强调@MartinSvalin的观点。根据我的经验,将状态放在类中(而不是类的实例)通常是一个非常糟糕的主意。你假设每一个实例都符合这个状态,即使当时这样认为是合理的,事情也会随着时间的推移而改变。如果初始化的数据依赖于环境(如操作系统),那么这没关系,但我建议不要这样做。这个答案描述了创建类实例的方法。OP表示,这不是所希望的。