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

Ruby-метод, например `self`, который ссылается на экземпляр

Есть ли в Ruby метод, который ссылается на текущий экземпляр класса, таким образом, что self относится к самому классу?

4b9b3361

Ответ 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

надеюсь, что эта помощь!