2016-05-01 5 views
0

私は引数を使ってクラスをインスタンス化する簡単な質問に苦労しています。例えば 私は2つの引数とクラスメソッドを取るイニシャライザを持つクラスを持っている: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 something 
    end 

end 

some_methodは、インスタンスメソッドだった場合、私はMyClassのの新しいオブジェクトをインスタンス化し、同様にインスタンスメソッドを呼び出すことができます。

MyClass.new("foo", "bar").some_method 

しかし、インスタンスの代わりにMyClass自体とクラスメソッドのためにどうすれば実現できますか?

MyClass.self( "foo"、 "bar")のようなものsome_methodは機能しません。

+2

クラスは実際に状態を保持するものではありません。それがインスタンスの仕事です。だからクラスメソッド 'some_method'をいくつかのデータに作用させたいのであれば、普通のことはそのデータを引数として渡すことです:' def self.some_method(string_1、string_2) '。 達成しようとしていることは何ですか?あなたがクラスをコントロールしているなら、 'some_method'をインスタンスメソッドにするようアドバイスします。 –

+0

詳細を教えていただきありがとうございます。クラスレベルでMyClass.new( "foo"、 "bar")の対応が可能かどうか不思議でした。 – StandardNerd

+1

@ MartinSvalinのポイントを強調したいと思います。私の経験上、(クラスの*インスタンス*とは対照的に)クラスに状態を入れることは、通常、非常に悪い考えです。すべての単一のインスタンスがその状態に準拠することを前提としており、その時に考えるのが妥当であっても、時間の経過とともに変化する可能性があります。初期化されたデータが環境(OSなど)に依存している場合は問題ありませんが、それ以外の場合は推奨しています。 –

答えて

2

これは可能です。

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_3は、クラスインスタンス変数です。

0

私はクラスを開始し、その後、それらの値にメソッドを実行するための従来の方法は次のようになると信じて:あなたはattr_accessorを使用したい場合、あなたはそれらの値を返すためにsome_methodをバイパスすることができ

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" 

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" 
+0

この回答は、クラスのインスタンス*を作成する方法を説明しています。 OPはこれが望ましいものではないと述べた。 –

関連する問題