LINUX.ORG.RU

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


0

0

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

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

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

★★

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

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

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

smh ★★★ ()
Ответ на: Re: Рефлексия методов в ruby от smh

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

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

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

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

ASM ★★ ()
Ответ на: Re: Рефлексия методов в ruby от smh

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

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

true_admin ★★★★★ ()

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

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

PartyZan ★★★ ()
Ответ на: Re: Рефлексия методов в ruby от PartyZan

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

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

imp ★★ ()

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

Короч 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 ★★ ()

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

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

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

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

ASM ★★ ()
Ответ на: Re: Рефлексия методов в ruby от ASM

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

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

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

smh ★★★ ()
Ответ на: Re: Рефлексия методов в ruby от smh

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

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

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 ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.