LINUX.ORG.RU

Рефлексия методов в ruby


0

0

Как известно есть такая штука как Marshal.dump, оно из объектов делает бинарную строку.

Вопрос: Можно ли получить не бинарик, а исходник на ruby из объекта? Имеется введу такой, что бы его можно было выполнить eval-ом. Сколько искал, что-то найти такой возможности не могу, может вы подскажете.

Задача: Из объекта получить исходник, проанализировать его, изменить при необходимости, выполнить.

★★

> Задача: Из объекта получить исходник, проанализировать его, изменить при необходимости, выполнить.

Я не очень понял что нужно, наверное, но если тебе нужен исходник, открой файл с исходником и прочитай его. Другими способами исходный код ты вряд ли получишь.

smh ★★★
()
Ответ на: комментарий от smh

Не, интересно именно получить его из объекта.

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

"на врятли" это не ответ. Уже нашёл хороший проект "ruby2ruby" правда не работает он у меня, разбираюсь... Но если такой проект есть, значит мои хотения реальны.

ASM ★★
() автор топика
Ответ на: комментарий от smh

smh, ты не прав. Можно расковырять существующие сериализаторы до того места где они делают eval. Тока, боюсь, они не в один проход это делают а каждый метод, каждый проперти, каждую переменную отдельно.

true_admin ★★★★★
()

А что мешает анализировать и модифицировать объект напрямую без конвертации в исходник?

PartyZan ★★★
()
Ответ на: комментарий от PartyZan

А что мешает анализировать и модифицировать исходник напрямую без конвертации в объект?

imp ★★
()

Короч ruby2ruby это умеет делать, но сегфолтится если работать с объектами а не классами. Правда везде написано что это работать должно.

$ cat test.rb
#!/usr/bin/env ruby
require 'ruby2ruby'
class TestClass
def test_func
[1,2,3].each{|l| puts "onotole" ; puts "vasermane kakbe" }
end
end
a = TestClass.new
s = Ruby2Ruby.translate(a.class)
puts s

$ ./test.rb
class TestClass < Object
def test_func
[1, 2, 3].each do |l|
puts("onotole")
puts("vasermane kakbe")
end
end
end

На тему зачем это надо, а надо это при метапрограмировании.

ASM ★★
() автор топика

Моя прога по мере выполнения модифицирует себя, добавляет/убирает/исправляет какие-то функции и переменные.

Мне интересно сохранять результат в файл так, что бы можно было поправить что-либо без особых проблем. Причём делать это во время выполнения программы...

Короч длинная история...

ASM ★★
() автор топика
Ответ на: комментарий от ASM

> Мне интересно сохранять результат в файл так, что бы можно было поправить что-либо без особых проблем. Причём делать это во время выполнения программы...

Что тебе мешает в начале программы загрузить исходный код и его модифицируя сохранять в файлы, а их потом загружать во время выполнения программы по мере надобности посредством load? Изменив в том файле код класса, все существующие объекты этого класса в запущенной программе "заметят" изменения.

smh ★★★
()
Ответ на: комментарий от smh

допустим я написал

class Windows
%w{bill balmer shit}.each do |n|
define_method(n) { puts "ololo #{n}" }
end
end

a = Windows.new
eval "def a.gentoo\n puts \"NO NO NO \"\nend"

Ещё раз, мне интересно получить именно готовый исходник, без метопрограмирования, то есть

class Windows
def bill
puts "ololo bill"
end
def balmer
puts "ololo balmer"
end
def shit
puts "ololo shit"
end
def gentoo
puts "NO NO NO "
end
end

ASM ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.