В чем разница между этими двумя фрагментами Ruby? - PullRequest
3 голосов
/ 25 января 2010

Фрагмент 1:

module A
  def cm(m,ret)
    class_eval do
     define_method(m.to_sym) do
       return ret
     end
    end
  end
end

и фрагмент 2:

module B
  def cm(m,ret)
    class_eval do
      "def #{m} #{ret} end"
    end
  end
end

Методы, определенные в этих модулях, должны использоваться для создания методов в классе, который возвращает определенные значения. Вот пример:

class Whatever
  extend A
  cm("two",2)
end

и это создаст метод с именем 2, который вернет 2. Дело в том, что код во втором фрагменте не работает. Есть идеи почему? Я думал, что class_eval может взять строку.

1 Ответ

5 голосов
/ 25 января 2010

class_eval принимает строку в качестве аргумента, но вы передали строку функции в блоке.

Попробуйте вместо этого:

module B
  def cm(m,ret)
    class_eval("def #{m}() #{ret} end")
  end
end
...