2009-05-25 2 views
4

Я рефакторинг кода, который я не писал, и я нашел строку, которая выглядит следующим образом (это намного больше, я использовал только немного для этого примера):Преобразование Рубинового кода строки

system("rubyw -e \"require 'win32ole'; @autoit=WIN32OLE.new('AutoItX3.Control');") 

для повышения удобства чтения, я переработан его

do_something = 
    "rubyw -e \" 
    require 'win32ole' 
    @autoit=WIN32OLE.new('AutoItX3.Control')" 
system do_something 

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

Есть ли простой способ написать код за пределами строки, а затем преобразовать его в строку?

Я искал в Интернете и stackoverflow, но не смог найти ответ.

Для получения дополнительной информации ознакомьтесь с оригинальным кодом на bret/watir (Watir :: FileField # set, строка 445), а моя вилка на zeljkofilipin/watir (строки 447-459).

ответ

6

Вы можете использовать следующий синтаксис:

do_something = <<SOMETHING 
    rubyw -e 
    require 'win32ole' 
    @autoit=WIN32OLE.new('AutoItX3.Control') 
SOMETHING 

Видимо это heredoc! Вы можете найти другой пример here(doc).

Это не означает, что команда не будет волноваться о наличии разрывов в ней. Однако вы могли бы запустить его на system do_something.split(/\r\n/).join('') или что-то в этом роде.

+0

Это называется «здесь документ», или «heredoc» (http://en.wikipedia.org/wiki/Here_document) –

+1

vim выделяет heredocs как строки. Кроме того, если вы хотите использовать многострочную строку без кавычек,% {} является более рубиновым способом сделать это – mk12

5

Ну, вы можете просто поместить код во внешний файл и загрузить его.

С другой стороны, если я правильно помню, в Ruby-файлы могут содержать DATA разделы:

# Sample ruby file: 

puts DATA.readline() 

__END__ 
foo bar 

Это должно напечатать "foo bar". Вы можете поместить свой код в сегмент данных. В любом случае ваш редактор по-прежнему будет выделять подсветку синтаксиса для сегмента DATA.

+0

Это только меня, или что-то не так с вашим примером? > puts DATA NameError: неинициализированная постоянная DATA от (irb): 1 –

+0

Это работает для меня ... ошибок нет. Однако я обновил исходный код, чтобы создать правильный вывод. –

+0

Спасибо, похоже, что в первый раз readline отсутствовал. –