Могу я define_method в моделях направляющих?

Один из способов обойти это (немного украсть у @jerry) - записать команду во временный файл и запустить ее с помощью оболочки

   set f [file tempfile fn "/tmp/cmd"]
   # open $fn w # unnecessary
   puts $f $cmd
   close $f
   set shcmd "echo \"`cat $fn`\""
   exec sh -c $shcmd 
   file delete $fn
23
задан salt.racer 19 November 2008 в 22:52
поделиться

3 ответа

Там ничто не волшебно или о модели направляющих, это - просто нормальный класс с набором существующих ранее методов,

Так, вопрос, "может я define_method в классе"?

Часть 1: Да Вы можете.

важное различие - чем можно определить метод в классе не в экземпляре метод

, Например:

class Cow
  define_method "speak" do
    "MOOOO"
  end
end

Cow.new.speak
=> "MOOOO"

Это должно хорошо работать. Обратите внимание определение его на классе Корова таким образом, любые другие Коровы, которых Вы уже имеете, автоматически добавят тот метод.

Часть 2: Что Вы делаете, если Вы хотите определить метод из метода экземпляра?

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

class Cow
  def add_speak
    self.class.send(:define_method, :speak) do
      "MOOOO added"
    end
  end
end

Cow.new.speak
NoMethodError: undefined method 'speak' for #<Cow:0xb7c48530>

Cow.new.add_speak
Cow.new.speak
=> "MOOOO added"

проблема решена. Проницательные читатели отметят, что в этом примере я использую send(:define_method) - это необходимо, потому что define_method является частным, и закрытые методы только доступны для вещи, в которой они находятся. В этом случае, define_method находится в классе, мы находимся в экземпляре, таким образом, мы не можем непосредственно получить доступ к нему.

Как выше, хотя, мы добавляем метод непосредственно к классу, таким образом, все другие Коровы, которые уже существуют, автоматически также получат говорить добавленный метод.

Часть 3: Что Вы делаете, если Вы хотите определить метод только для 1 объекта, не всех объектов того класса?

Пример:

class Cow
  def add_speak_just_me
    class << self
      define_method "speak" do
        "MOOOO added for just me"
      end
    end
  end
end

Cow.new.speak
NoMethodError: undefined method 'speak' for #<Cow:0xb7c72b78>

c = Cow.new
c.add_speak_just_me
c.speak
=> "MOOOO added for just me" # it works, hooray

Cow.new.speak # this new cow doesn't have the method, it hasn't been automatically added
NoMethodError: undefined method `speak' for #<Cow:0xb7c65b1c>

, Как это работает? Вниз кроличья нора Вы идете!

Read это: http://dannytatom.me/metaid/ и удача. Помогает, когда Вы понимаете, что 'добавление метода' к экземпляру на самом деле не добавляет его к экземпляру во всем:-)

79
ответ дан 29 November 2019 в 00:44
поделиться

смог починить это. Очень мало понимания того, что на самом деле продолжается все же.

Мое нечто метода экземпляра открывает класс и определяет панель на нем так, чтобы я мог тогда назвать это на своем экземпляре. Более опытные люди сообщат нам, открывает ли это кучу проблем одновременно.

было бы полезно для знания определенного использования для этого все же.

class User < ActiveRecord::Base

  def foo
    (class << self; self; end).class_eval do
      define_method(:bar) {puts "bar"}
    end
  end
end

u = User.first
u.foo
u.bar #=> "bar"
2
ответ дан 29 November 2019 в 00:44
поделиться

Ответ на Ваш вопрос "да, Вы можете". Что касается того, почему это не работает на Вас - невозможно сказать наверняка, почему, если Вы не обеспечиваете некоторый контекст для кода.

1
ответ дан 29 November 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: