Когда вы используете self.property_name
в Ruby?
В Ruby, когда вы должны использовать себя. в ваших классах?
Ответ 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 изнутри объекта.