Указатели метода в рубине
Я хочу хранить несколько разных методов в массиве в Ruby. Предположим, что я хочу сохранить метод type
дважды:
[type, type]
не хранит две записи type
в массиве; он выполняет type
дважды и сохраняет результаты в массиве. как я могу явно ссылаться на объект метода?
(это просто упрощенная версия того, что я действительно хочу.)
EDIT: во-вторых, меня беспокоит, что предлагаемое ниже решение позволяет избежать проблемы, передав имя метода. как вы сами передаете объект метода? например, что, если вы передадите [: type,: type] методу, который имеет альтернативное разрешение для типа? как вы можете передать объект метода типа?
Ответы
Ответ 1
Если вы хотите сохранить метод, а не результат вызова метода или просто сообщение, которое вы отправляете для его вызова, вам нужно использовать метод method
на собственном объекте. Так, например,
"hello".method(:+)
вернет + метод объекта "привет", так что, если вы назовете его аргументом "мир", вы получите "привет мир".
helloplus = "hello".method(:+)
helloplus.call " world" # => "hello world"
Ответ 2
Если вы думаете о выполнении ссылок на методы в Ruby, вы делаете это неправильно.
В Ruby есть встроенный метод, называемый method
. Он вернет proc-версию метода. Однако это не ссылка на оригинальный метод; каждый вызов method
создаст новый proc. Изменение метода не влияет на процесс, например.
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 }
Ответ 3
[:type, :type].collect { |method_name| self.send(method_name) }
В качестве альтернативы, если этот метод является частью объекта:
method = obj.method(:type)
values = [method.call, method.call]