Свойства не изменяются при назначении значений? - PullRequest
1 голос
/ 18 марта 2012

Я немного Руби, нуб, и есть кое-что, чего я не понимаю.У меня есть что-то вроде этого:

def my_method
    attr1 = 'new 1 value'
    attr2 = 'new 2 value'
    puts "#{attr1} - #{attr2}"
    puts "Should be same? #{to_s}"
end

def to_s
    "#{attr1} - #{attr2}"
end

Когда я звоню my_method, я получаю:

new 1 value - new 2 value 
Should be same? old 1 value - old 2 value

Ха?

Ответы [ 3 ]

1 голос
/ 18 марта 2012

Это область действия attr1 и attr2 - локальные переменные.

Поэтому, когда вы звоните to_s, он ищет attr_1 и attr_2, которые вы объявили (вероятно) в области видимости класса.Они не будут перезаписаны при запуске my_method, вместо этого вы просто создали новую переменную в меньшем объеме.

Попробуйте вместо этого использовать @attr_1 и @attr_2.

Извлечь Местная переменная Gotchas

1 голос
/ 18 марта 2012

Есть два способа сделать это.Одним из них является использование переменных области класса вместо локальных переменных:

class MyClass

    def my_method
        @attr1 = 'new 1 value'
        @attr2 = 'new 2 value'
        puts "#{@attr1} - #{@attr2}"
        puts "Should be same? #{self.to_s}"
    end

    def to_s
        "#{@attr1} - #{@attr2}"
    end
end

m = MyClass.new
m.my_method

Вывод:

new 1 value - new 2 value
Should be same? new 1 value - new 2 value

Другой способ заключается в использовании атрибутов, которые необходимо специально вызывать как методы дляself:

class MyClass
    attr_accessor :attr1,:attr2

    def my_method
        self.attr1 = 'new 1 value'
        self.attr2 = 'new 2 value'
        puts "#{attr1} - #{attr2}"
        puts "Should be same? #{self.to_s}"
    end

    def to_s
        "#{attr1} - #{attr2}"
    end
end

m = MyClass.new
m.my_method

Это имеет тот же вывод.

1 голос
/ 18 марта 2012

Это потому, что в Ruby

x = y

это всегда присвоение значения, полученного в результате y, переменной x, в то время как

obj.x = y

- это всегда отправка x= сообщения объекту obj (со значением, полученным из y).

В Ruby атрибуты / свойства на самом деле просто методы!Таким образом, попробуйте:

self.attr1 = 'new 1 value'
self.attr2 = 'new 2 value'

С другой стороны, y может быть или не быть вызовом метода (читай: property fetch).Это зависит от того, существует ли уже переменная y в области видимости или нет, потому что переменные shadow методы.Вот почему attr1 и attr2 работают в to_s без префикса.

Счастливого кодирования.

...