Рубиновое определение себя - PullRequest
12 голосов
/ 17 мая 2009

Я читал книгу по Ruby и наткнулся на это определение псевдопеременной self:

самоприемник объекта текущего Метод

Может ли кто-нибудь сломать это определение и объяснить, что оно означает? Я ничего не понимаю.

РЕДАКТИРОВАТЬ: На самом деле у меня есть довольно хорошее представление о том, что такое я (и его приложения), и я знаю, как искать в Google. Мне просто интересно, может ли кто-нибудь объяснить приведенное мной определение. Это конкретно.

Ответы [ 3 ]

20 голосов
/ 17 мая 2009

Ruby и другие языки (такие как Smalltalk и Objective-C) предпочитают термин «передача сообщений», тогда как Java и C ++ предпочитают «вызов метода». То есть «способ Java» - это вызов метода для объекта & mdash; запуск кода в контексте объекта & mdash; тогда как "Ruby way" - это отправить объекту сообщение, на которое объект отвечает, запустив свой метод.

Ruby будет описывать строку my_string.length как "отправку my_string length сообщения". my_string получает сообщение и называется получателем; внутри определения метода length, self будет ссылаться на my_string. Вы можете получить тот же эффект с my_string.send(:length).

Мышление этой концепции с точки зрения передачи сообщений является более гибким, чем мышление с точки зрения вызова метода. Чтобы вызвать метод для объекта, этот метод должен быть предварительно определен, тогда как вы можете отправить объекту сообщение, которое он может выбрать для динамической обработки (с respond_to? и method_missing). Эта гибкость является одним из аспектов, который позволяет использовать Ruby в качестве лаконичных доменных языков (DSL).

12 голосов
/ 17 мая 2009

self - это специальная переменная, которая изменяется в зависимости от контекста. Чтобы быть более конкретным, это объект-получатель текущего метода, как вы упомянули. Чтобы понять это, нам нужно понять, что означает приемник.

См. Программирование Ruby : Подробнее о методах и Классы и объекты .

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

connection.downloadMP3("jitterbug") { |p| showProgress(p) }

В этом примере объект connection downloadMP3 является получателем Название метода, "jitterbug" является параметр, и материал между фигурные скобки - это связанный блок.

foo = "hello"
bar = foo.dup
class <<foo
  def to_s
    "The value is '#{self}'"
  end
  def twoTimes
    self + self
  end
end

foo.to_s        »   "The value is 'hello'"
foo.twoTimes    »   "hellohello"
bar.to_s        »   "hello"

В foo.twoTimes, foo часть называется получателем вызова метода. Так, в методе twoTimes self относится к объекту foo в контексте.

Здесь также есть очень хорошее объяснение

4 голосов
/ 17 мая 2009

самоприемник объекта текущего Метод

«Вызов метода» в Ruby осуществляется через механизм отправки сообщений. Итак

some_object.some_method(args)

является сокращением для

some_object.send(:some_method, args)

Я думаю, что это то, на что ссылается цитата: «self» - это объект, которому было отправлено сообщение (или метод): получатель текущего метода.

Вся функция отправки сообщений является частью того, что делает Ruby таким динамичным. Это позволяет объекту легко определять method_missing для сообщений, которые он в данный момент не обрабатывает, и решать, что с ними делать. Rails часто использует это: ActiveRecord, например, имеет синтаксис «find_by ...», который вычисляет, что нужно по имени метода, называемого / sent.

...