3 мин на чтение

title: Смайлики для Jekyll category:

  • Jekyll toc: true toc_label: “Содержание” toc_icon: “file-alt” toc_sticky: true — category:
  • Ruby

    Если вы изучаете Ruby, использование ключевого слова «self» может вас сбить с толку.

Как это работает?

Что значит self?

Это ключевое слово Ruby , которое дает вам доступ к текущему объекту.

Этот «текущий объект» зависит от контекста.

Контекст?

Да, контекст — это то, где находится ваш код в любой момент времени.

Вот пример :

Если ваш код находится внутри метода экземпляра, self он является экземпляром этого класса. Другими словами, self это объект.

Вы можете увидеть это в действии сами.

Запустите этот код :

def coffee
  puts self
end
coffee
# main

Этот код определяет и вызывает метод coffee, который печатает значение self.

Почему он печатает main?

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

Как наш coffee метод здесь.

Но если вы определите метод внутри класса с именем Cat, этот self будет объектом Cat.

Как видно здесь :

class Cat
  def meow
    puts self
  end
end
Cat.new.meow
# <Cat:0x7a14c5>

Из этих примеров мы можем сказать, что значение self меняется в зависимости от того, где вы его используете.

Сейчас :

Я считаю, что можно лучше понять что угодно, поняв его цель.

Почему self полезен?

Давайте посмотрим на несколько примеров.

Использование Self для устранения неоднозначности

Одно из практических применений self— уметь отличить метод от локальной переменной.

Не лучшая идея называть переменную и метод одинаковыми. Но если вам придется работать с подобной ситуацией, вы сможете вызвать метод с помощью self.method_name.

Вот что я имею в виду :

class Example
  def do_something
    banana = "variable"
    puts banana
    puts self.banana
  end
  def banana
    "method"
  end
end
Example.new.do_something
# "variable"  => puts banana
# "method"    => puts self.banana

Здесь у нас есть локальная переменная banana внутри do_something метода, но у нас также есть метод banana.

Локальная переменная имеет приоритет.

Вот почему нам нужно использовать self здесь, если мы хотим вызвать метод banana, а не печатать значение переменной banana.

Давайте посмотрим на более распространенный вариант использования… Определение методов класса!

Использование Self для определения методов уровня класса Использование номер один для self, без сомнения, — это определение методов уровня класса.

Я уверен, что вы видели определения def self.method_name методов .

Как этот:

class Salad
  def self.buy_olive_oil
    # ...
  end
end
Salad.buy_olive_oil

Здесь это self эквивалентно имени класса Salad.

Почему это полезно?

Потому что нам не нужно использовать имя класса для каждого определения метода, что упрощает изменение нашего кода, если мы изменим класс.

Кроме того его легче читать.

Вот почему мы делаем def self.buy_olive_oil вместо def Salad.buy_olive_oil.

Другое использование self

Существует еще больше вариантов использования self, поэтому полезно ознакомиться с примерами.

Например :

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

Что-то вроде этого :

def ==(other)
  self == other
end

Вы также можете использовать self в целях отладки, чтобы узнать, с каким объектом вы работаете.

Вот так вот :muscle::

p self

Или вы можете использовать его в качестве возвращаемого значения для реализации шаблонов проектирования, таких как шаблон проектирования Builder .

Пример :

class Salad
  def initialize
    @ingredients = []
  end
  def add_nuts
    @ingredients << :nuts
    self
  end
end
my_salad = Salad.new.add_nuts

Подводя итог, вот список полезных применений для себя :

  • Определение методов уровня класса
  • Используйте метод экземпляра, если у вас есть локальная переменная с тем же именем.
  • Возвращение себя (шаблон строителя)
  • Отладка
  • Сравнение объектов (==)
  • Получатель вызовов методов по умолчанию

Прежде чем закончить с этой темой, нам следует рассмотреть еще одну вещь.

Метод Kernel#itself.

Это метод, который вы можете вызвать для объекта, и объект вернется сам.

Пример :

[1,2,3,nil].select(&:itself)
# [1, 2 ,3]

В этом примере фильтры nilи falseзначения.

Понимание разницы :

selfэто ключевое слово. Его ценность зависит от того, где вы его используете. itselfэто метод. Его значение зависит от того, на каком объекте вы его используете (в 1.itself- 1это объект) Надеюсь, это полезно.

Заключение

Вы узнали о ключевом слове Ruby self: что это такое, почему оно полезно и как его использовать.

Теперь ваша очередь попробовать.

Спасибо за прочтение! :wave:

Дата изменения:

Оставить комментарий