Когда использовать self для Ruby Class - PullRequest
3 голосов
/ 20 июня 2019

Может кто-нибудь помочь мне различить, когда мы создаем методы внутри блока class << self и когда мы определяем нормальные методы.

Я видел где-то код, подобный этому, но я не знаю кратко их использования

class Foo
  def initialize
  end

  def bar
  end

  class << self
    def foobar
    end
  end
end

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

«Нормальными» методами, определенными внутри блока class, являются методы экземпляра :

class Foo
  def bar
  end
end

Методы, определенные в class << self внутри блока class: методы класса :

class Foo
  class << self
    def baz
    end
  end
end

Методы экземпляра становятся доступными для любого экземпляра данного класса:

foo = Foo.new
foo.bar

Принимая во внимание, что методы класса могут быть вызваны непосредственно в классе:

Foo.baz

Попытка вызова методов экземпляра в классе или наоборот приводит к ошибке:

Foo.bar #=> NoMethodError: undefined method `bar' for Foo:Class
foo.baz #=> NoMethodError: undefined method `baz' for #<Foo:0x00007ffe20055a20>

Еще один способ определения методов класса - префикс имени метода с self.:

class Foo
  def self.baz
  end
end

Вы также можете определить их вне блока class, хотя это редко можно увидеть:

def Foo.baz
end

Или также:

class << Foo
  def baz
  end
end

Обратите внимание, что определение методов таким способом не ограничивается классами. Вы можете добавлять методы к произвольным объектам, например ::

o = Object.new

def o.hello
  "hello from o"
end

o.hello
#=> "hello from o"

Или через:

class << o
  def hello
    "hello from o"
  end
end

Внутренне эти методы добавляются к одноэлементному классу объекта . Это специальный класс для хранения методов только для этого экземпляра:

o.singleton_class.instance_methods(false)
#=> [:hello]

Для Foo класса выше:

Foo.instance_methods(false)                 #=> [:bar]
Foo.singleton_class.instance_methods(false) #=> [:baz]

Технически, метод класса - это просто метод экземпляра, определенный в синглтон-классе класса.

2 голосов
/ 20 июня 2019

Возможно, вам понадобится прочитать методы экземпляра и класса Ruby. Но лично я бы сделал

class Foo
  class << self
    def foobar
    end
  end
end

вместо

class Foo
  def self.foobar
  end
end

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

class Foo
  private
  def self.foobar
  end
end

не будет работать так же, как

class Foo
  class << self
    private
    def foobar
    end
  end
end
0 голосов
/ 20 июня 2019

Спасибо, парень, за то, что поделился своими знаниями.Подводя итог тому, что я прочитал по этой ссылке

Когда вы будете использовать метод класса?

Метод класса - это часть функциональности, которая принадлежитк этому классу, но не привязан к какому-либо конкретному экземпляру.

Например,

Product.find(1)
Product.new(params[:product])

Когда вы будете использовать методы экземпляра?

Методы экземпляра используются, когда вам нужно воздействовать на конкретный экземпляр класса.

Часто это происходит, когда функциональность касается идентификации экземпляра, например, вызова свойств объекта или вызова поведения.

Например

@product.save
@product.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...