Определение Ruby сам

Соедините две таблицы, сгруппируйте их по первичному ключу таблицы сотрудников и упорядочите результаты по убыванию, получив первый результат (имеющий наибольшее количество результатов)

select employee.salesrepemployeenumber, employee.lastname, employee.firstname, count(*) as result
from employee
join customer
on employee.employeenumber = customer.salesrepemployeenumber
group by employeenumber
order by count(*) desc limit 0, 1;
13
задан Devoted 17 May 2009 в 07:57
поделиться

3 ответа

самоприемный объект текущего method

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

some_object.some_method(args)

- это сокращение для

some_object.send(:some_method, args)

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

Отправка сообщений - это часть того, что делает Ruby таким динамичным. Это позволяет объекту легко определить method_missing для сообщений, которые он в настоящее время не обрабатывает, и решить, что с ними делать. Rails часто использует это: ActiveRecord, например, имеет синтаксис "find_by ...", который определяет, что нужно, из имени метода, вызванного / отправленного.

4
ответ дан 1 December 2019 в 19:02
поделиться

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

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

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

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

В этом примере объект соединение - приемник, 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 в контексте.

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

14
ответ дан 1 December 2019 в 19:02
поделиться

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

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

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

21
ответ дан 1 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: