Как добавить метод к существующему экземпляру объекта во время выполнения в Ruby? - PullRequest
3 голосов
/ 12 ноября 2011

В Javascript я мог бы сделать это.

var a = {};
a.f1 = function(){};

Как я могу сделать это в Ruby?


Update.

В коде JS a - это объект, созданный без класса. И function(){} является анонимной функцией, а a.f1 = добавляет функцию к экземпляру объекта. Таким образом, функция связана только с экземпляром, и ничто не связано с классом или подобными определениями.

Ответы [ 2 ]

13 голосов
/ 12 ноября 2011

Объектные модели Ruby и JS очень разные, но прямой перевод может выглядеть так:

a = Object.new
def a.f1(x) 
  2*x
end

a.f1(5) #=> 10

Вы также можете использовать собственный класс Ruby:

class Object
  def metaclass
    class << self; self; end
  end
end

a = Object.new    
# Also: (class << a; self; end).send(:define_method, :f1) do |x|
a.metaclass.send(:define_method, :f1) { |x| 2*x }

Предупреждение: вы будете видеть этот тип кода в мета-программировании / monkeypatching / ... но это необычно при написании "нормального" кода, где применяются другие методы (в основном, расширения модулей).

3 голосов
/ 12 ноября 2011

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

Давайте представим, что {} - это класс A в ruby, и вы создаете из него объект

class A
end

a = A.new

И F1 сидения в некотором модуле B

module B
  def f1
    puts "you've extended your object"
  end
end

Теперь вы можете делать то, что хотите, аналогичным образом

a.extend(B)

a.f1 #=> "you've extended your object"
...