2016-05-01 3 views
0

Я борюсь с простым вопросом, как создать экземпляр класса с аргументами. Например у меня есть класс с инициализатора, который принимает два аргумента и метода класса: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»). Some_method на уровне класса. – StandardNerd

+1

Я хотел бы подчеркнуть точку зрения МартинаСвалина. По моему опыту, включение состояний в классы (в отличие от * экземпляров * классов) обычно является очень плохой идеей. Вы делаете предположение, что каждый экземпляр будет соответствовать этому состоянию, и даже когда разумно думать об этом в то время, со временем все может измениться. Если инициализированные данные зависят от среды (например, ОС), тогда это нормально, но в противном случае я бы рекомендовал против нее. –

ответ

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

Я считаю, что традиционный способ начать класс, а затем запустить метод на этих значений будет, как:

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_accessor, то вы можете обойти some_method вернуть эти значения:

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

Этот ответ описывает способ создания * экземпляра * класса. ОП заявил, что это не * то, что было желательным. –

Смежные вопросы