Re: [Ruby] Фабрика, eval или что-то еще
SoNaR
sonar на scli.ru
Пн Июл 26 18:45:28 MSD 2004
Уважаемый SoNaR,
Monday, July 26, 2004, 6:35:48 PM, Вы писали следующее:
S> Уважаемый Ruby,
S> Есть такой метод:
S> def parse( body = @mail.body )
S> {
S> 'SEND_ME' => /SEND ME (.*)/i,
S> 'ALIAS' => /\$[a-z]+\$/i
S> }.inject( [] ){ |result,i|
S> key, value = i
S> result += case key
S> when 'SEND_ME'
S> ETALON6_SEND_ME.new( @mail.from[0], body.scan( value ) ).create_request
S> when 'ALIAS'
S> ETALON6_ALIAS.new( @mail.from[0], body.scan( value ) ).create_request
S> else
S> []
S> end
S> result
S> }
S> end
S> Хочу избавиться от case_when, но ничего кроме eval И фабрики в
S> голову не лезет.
S> def parse( body = @mail.body )
S> {
S> 'SEND_ME' => /SEND ME (.*)/i,
S> 'ALIAS' => /\$[a-z]+\$/i
S> }.inject( [] ){ |result,i|
S> key, value = i
S> result += eval( [ self.class.to_s.split('_').last, key].join('_') ).new( @mail.from[0], body.scan( value ) ).create_request
S> result
S> }
S> end
S> Фабрику делать не с руки, т.к. объекты обычно по одному ходят. Может
S> вообще как-то без них обойтись? Но тогда коряво получается... Чего посоветуете?
Решение как всегда пришло тогда, когда я нажал кнопку SEND. :-) Я
создал массив с именами классов, а регулярные выражения запрятал
в эти самые классы. В результате получилось вроде как красивее... :-)
def parse( body = @mail.body )
[ ETALON6_SEND_ME, ETALON6_ALIAS ].inject( [] ){ |result,class_name|
result += class_name.new( @mail.from[0], body.scan( value ) ).create_request
result
}
end
---
г.Москва, Научный центр правовой информации при Минюсте РФ
Шипиев Роман Николаевич
Начальник отдела проектирования, программирования
и сопровождения информационных систем.
Тел: (095) 459-05-12
E-Mail: sonar на scli.ru
UIN: 289794359
Подробная информация о списке рассылки Ruby