Подтвердить что ты не робот

Указатели метода в рубине

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

[type, type]

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

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

EDIT: во-вторых, меня беспокоит, что предлагаемое ниже решение позволяет избежать проблемы, передав имя метода. как вы сами передаете объект метода? например, что, если вы передадите [: type,: type] методу, который имеет альтернативное разрешение для типа? как вы можете передать объект метода типа?

4b9b3361

Ответ 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]