Есть ли в Ruby метод, который ссылается на текущий экземпляр класса, таким образом, что self
относится к самому классу?
Ruby-метод, например `self`, который ссылается на экземпляр
Ответ 1
self
всегда ссылается на экземпляр, но сам класс является экземпляром Class
. В определенных контекстах self
будет ссылаться на такой экземпляр.
class Hello
# We are inside the body of the class, so `self`
# refers to the current instance of `Class`
p self
def foo
# We are inside an instance method, so `self`
# refers to the current instance of `Hello`
return self
end
# This defines a class method, since `self` refers to `Hello`
def self.bar
return self
end
end
h = Hello.new
p h.foo
p Hello.bar
Вывод:
Hello
#<Hello:0x7ffa68338190>
Hello
Ответ 2
Внутри экземпляра метод класса self
относится к этому экземпляру. Чтобы получить класс внутри экземпляра, вы можете вызвать self.class
. Если вы вызываете self
внутри метода класса, вы получаете класс. Внутри метода класса вы не можете получить доступ к любому экземпляру класса.
Ответ 3
Ссылка self
всегда доступна, и объект, на который она указывает, зависит от контекста.
class Example
self # refers to the Example class object
def instance_method
self # refers to the receiver of the :instance_method message
end
end
Ответ 4
метод self
относится к объекту, к которому он принадлежит. Определения классов также являются объектами.
Если вы используете определение self
внутри класса, оно ссылается на объект определения класса (классу), если вы вызываете его внутри метода класса, он снова ссылается на класс.
Но в методе экземпляра он ссылается на объект, являющийся экземпляром класса.
1.9.3p194 :145 > class A
1.9.3p194 :146?> puts "%s %s %s"%[self.__id__, self, self.class] #1
1.9.3p194 :147?> def my_instance_method
1.9.3p194 :148?> puts "%s %s %s"%[self.__id__, self, self.class] #2
1.9.3p194 :149?> end
1.9.3p194 :150?> def self.my_class_method
1.9.3p194 :151?> puts "%s %s %s"%[self.__id__, self, self.class] #3
1.9.3p194 :152?> end
1.9.3p194 :153?> end
85789490 A Class
=> nil
1.9.3p194 :154 > A.my_class_method #4
85789490 A Class
=> nil
1.9.3p194 :155 > a=A.new
=> #<A:0xacb348c>
1.9.3p194 :156 > a.my_instance_method #5
90544710 #<A:0xacb348c> A
=> nil
1.9.3p194 :157 >
Вы видите puts # 1, который выполняется во время объявления класса. Он показывает, что class A
является объектом типа Class с id == 85789490. Таким образом, внутри класса декларация self относится к классу.
Затем при вызове методов класса (# 4) self
метод внутри класса (# 2) снова ссылается на этот класс.
И когда вызывается метод экземпляра (# 5), он показывает, что внутри него (# 3) self
ссылается на объект экземпляра класса, к которому привязан метод.
Если вам нужно передать класс внутри метода экземпляра, используйте self.class
Ответ 5
может быть вам нужен: сам метод?
1.itself => 1
'1'.itself => '1'
nil.itself => nil
надеюсь, что эта помощь!