Метод указателей в рубине - PullRequest
       25

Метод указателей в рубине

16 голосов
/ 14 сентября 2009

Я хочу хранить несколько различных методов в массиве в Ruby. Предположим, я хочу сохранить метод type дважды:

[type, type]

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

(это просто упрощенная версия того, что я действительно хочу.)

РЕДАКТИРОВАТЬ: если подумать, меня беспокоит, что предложенное ниже решение позволяет избежать проблемы путем передачи имени метода. как вы передаете сам объект метода? например, что если вы передадите [: type,: type] методу, имеющему альтернативное разрешение для типа? как вы можете передать сам объект метода типа?

Ответы [ 3 ]

33 голосов
/ 14 сентября 2009

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

"hello".method(:+)

вернет метод + объекта "hello", так что если вы вызовете его с аргументом "world", вы получите "hello world".

helloplus = "hello".method(:+)
helloplus.call " world" # => "hello world"
13 голосов
/ 14 сентября 2009

Если вы думаете о создании ссылок на методы в Ruby, вы делаете это неправильно.

В Ruby есть встроенный метод, который называется method. Он вернет версию метода. Это не ссылка на оригинальный метод; каждый вызов method создаст новый процесс. Изменение метода не повлияет на процесс, например.

def my_method
  puts "foo"
end

copy = method(:my_method)

# Redefining
def my_method
  puts "bar"
end

copy.call
# => foo

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

stack = [proc { do_this }, proc { do_that }]
stack.each {|s| s.call }
1 голос
/ 14 сентября 2009
[:type, :type].collect { |method_name| self.send(method_name) }

В качестве альтернативы, если метод является частью объекта:

method = obj.method(:type)
values = [method.call, method.call]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...