2016-09-26 3 views
1

Я создал класс, напримерИнициализировать переменную класса объекта в RUBY

class Result 
    @@min = 0 
    @@max = 0 
    def initialize(min, max) 
     @@max.min = min 
     @@max.max = max 
    end 
end 

result = Result.new(1, 10) 
result.max 

То же, что другие языки. как PHP, C# и т.д. Я создал класс и передать значение и, поскольку он имеет инициализировать метод он будет должны теперь содержит значение объектов, но при попытке распечатать

puts result.min 
puts result.max 

это говорит неопределенный метод min

ответ

3

В Ruby, @@ до того, как переменная означает, что это переменная класса, вам нужно только одно значение @ перед переменной, чтобы создать переменную экземпляра. Когда вы делаете Result.new(..), вы создаете экземпляр класса Result.

Вам не нужно создавать значения по умолчанию, как это:

@@min = 0 
@@max = 0 

Вы можете сделать это в методе initialize

def initialize(min = 0, max = 0) 

Это будет инициализировать min и max равным нулю нет значения .

Итак, ваш метод initialize должен понравиться примерно

def initialize(min=0, max=0) 
    @min = min 
    @max = max 
end 

Теперь, если вы хотите быть в состоянии назвать .min или .max методов экземпляра класса, вы должны создать эти методы (так называемые сеттер и добытчик)

def min # getter method 
    @min 
end 

def min=(val) # setter method 
    @min = val 
end 

Теперь вы может это сделать:

result.min  #=> 1 
result.min = 5 #=> 5 

рубин имеет ярлыки для этих сеттеров и добытчиками:

  • attr_accessor: создает методы сеттера и геттера.
  • attr_reader: создать метод геттера.
  • attr_writer: создать метод сеттера.

Чтобы использовать те, вам просто нужно сделать attr_accessor :min, это создаст оба метода для min, так что вы можете позвонить и установить минимальные значения непосредственно через объект экземпляра.

Теперь вы код должен выглядеть следующим образом

class Result 
    attr_accessor :min, :max 
    def initialize(min=0, max=0) 
     @min = min 
     @max = max 
    end 
end 

result = Result.new(1, 10) 
result.max #=> 10 
+0

Если по какой-то причине вам действительно нужны все экземпляры 'Result' для совместного использования одного и того же значения, посмотрите на' cattr_accessor' - но это будет означать, что инициализация второго результата заменит значение, которое вы установили в первом! – gmcnaughton

+0

, так что все, что мне нужно, это attr_accessor, он работает мужчинам спасибо – Beginner

1

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

class Result 
    attr_accessor :min, :max 

    def initialize(min, max) 
    @max = min 

    @max = max 
    end 
end 

Переменные класса в Ruby и лучше избегать, если они вам в действительности не нужны.Если вы на самом деле вы можете сделать это:

class Result 
    @@min = 0 

    @@max = 0 

    def self.min 
    @@min 
    end 

    def self.min=(new_min) 
    @@min = new_min 
    end 

    def self.max 
    @@max 
    end 

    def self.max=(new_max) 
    @@max = new_max 
    end 

    def initialize(min, max) 
    @@min = min 

    @@max = max 
    end 

    def min 
    @@min 
    end 

    def max 
    @@max 
    end 
end 

puts Result.min 

puts Result.max 

result = Result.new(1, 10) 

puts result.min 

puts result.max 

puts Result.min 

puts Result.max 

Будьте осторожны, хотя, class variables are tricky.

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