Подтвердить что ты не робот

В Ruby, когда вы должны использовать себя. в ваших классах?

Когда вы используете self.property_name в Ruby?

4b9b3361

Ответ 1

Используйте self при вызове мутатора класса. Например, это не сработает:

class Foo
  attr_writer :bar
  def do_something
    bar = 2
  end
end

Проблема заключается в том, что "bar = 2" создает локальную переменную с именем "bar", а не вызывает метод "bar =", который был создан attr_writer. Однако немного self исправит это:

class Foo
  attr_writer :bar
  def do_something
    self.bar = 2
  end
end

self.bar = 2 вызывает метод bar= по желанию.

Вы также можете использовать self для вызова читателя с тем же именем, что и локальная переменная:

class Foo
  attr_reader :bar
  def do_something
    bar = 123
    puts self.bar
  end
end

Но обычно лучше не указывать локальную переменную с тем же именем, что и аксессор.

Ответ 2

self ссылается на текущий объект. Это поддается многому использованию:

вызов метода для текущего объекта

class A
    def initialize val
        @val = val
    end
    def method1
        1 + self.method2()
    end
    def method2
        @val*2
    end
end

Здесь работает A.new(1).method1() будет возвращать 3. Использование self необязательно здесь - следующий код эквивалентен:

class A
    def initialize val
        @val = val
    end
    def method1
        1 + method2()
    end
    def method2
        @val*2
    end
end

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

class A
    def initialize val
        @val = val
    end
    def [] x
        @val + x
    end
    def method1 y
        [y] #returns an array!
    end
    def method2 y
        self.[y] #executes the [] method
    end
end

Это показывает, как использовать self, если вы хотите вызвать метод текущего объекта [].

ссылки атрибутов

Вы можете сгенерировать методы для чтения и записи в переменные экземпляра с помощью attr_accessor и co.

class A
    attr_accessor :val
    def initialize val
        @val = val
    end
    def increment!
        self.val += 1
    end
 end

Использование self избыточно здесь, потому что вы можете просто ссылаться на переменную напрямую, например. @val. Используя предыдущий класс, A.new(1).increment! вернет 2.

цепочка методов

Вы можете вернуть себя, чтобы обеспечить форму синтаксического сахара, известную как цепочка:

class A
    attr_reader :val
    def initialize val
        @val = val
    end
    def increment!
        @val += 1
        self
    end
 end

Здесь, поскольку мы возвращаем текущий объект, методы могут быть привязаны:

A.new(1).increment!.increment!.increment!.val #returns 4

создание методов класса

Вы можете определить методы класса, используя self:

class A
    def self.double x
          x*2
    end
    def self.quadruple x
        self.double(self.double(x))
    end
end

Это позволит вам вызвать A.double(2) #= 4 и A.quadruple(2) #=8. Обратите внимание, что в методе класса self ссылается на этот класс, потому что класс является текущим объектом.

как определяется значение self

Текущее значение self в определенном методе устанавливается на объект, к которому был вызван этот метод. Обычно это использует '.' нотации. Когда вы запускаете some_object.some_method(), self привязан к некоторому_объекту на протяжении некоторого_метода, что означает, что some_method может использовать self одним из способов, упомянутых выше.

Ответ 3

Использование self используется для ссылки на текущий объект, доступный внутри программы. Поэтому self.property используется при доступе к переменной через attr_accessor. В обязательных случаях он может использоваться вместо @property изнутри объекта.