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表示,这不是所希望的。