Один из способов обойти это (немного украсть у @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
Там ничто не волшебно или о модели направляющих, это - просто нормальный класс с набором существующих ранее методов,
Так, вопрос, "может я define_method в классе"?
важное различие - чем можно определить метод в классе не в экземпляре метод
, Например:
class Cow
define_method "speak" do
"MOOOO"
end
end
Cow.new.speak
=> "MOOOO"
Это должно хорошо работать. Обратите внимание определение его на классе Корова таким образом, любые другие Коровы, которых Вы уже имеете, автоматически добавят тот метод.
Вы не можете определить методы от метода экземпляра, таким образом, необходимо захватить класс и использование что определить метод. Как это:
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
находится в классе, мы находимся в экземпляре, таким образом, мы не можем непосредственно получить доступ к нему.
Как выше, хотя, мы добавляем метод непосредственно к классу, таким образом, все другие Коровы, которые уже существуют, автоматически также получат говорить добавленный метод.
Пример:
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/ и удача. Помогает, когда Вы понимаете, что 'добавление метода' к экземпляру на самом деле не добавляет его к экземпляру во всем:-)
смог починить это. Очень мало понимания того, что на самом деле продолжается все же.
Мое нечто метода экземпляра открывает класс и определяет панель на нем так, чтобы я мог тогда назвать это на своем экземпляре. Более опытные люди сообщат нам, открывает ли это кучу проблем одновременно.
было бы полезно для знания определенного использования для этого все же.
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"
Ответ на Ваш вопрос "да, Вы можете". Что касается того, почему это не работает на Вас - невозможно сказать наверняка, почему, если Вы не обеспечиваете некоторый контекст для кода.