Использование Named Captures с регулярным выражением в случае Ruby... когда?
Я хочу проанализировать ввод пользователя, используя именованные записи для удобочитаемости.
Когда они вводят команду, я хочу захватить некоторые параметры и передать их. Я использую RegExps в case case, и поэтому я не могу назначить возврат /pattern/.named_captures
.
Вот что я хотел бы сделать (например):
while command != "quit"
print "Command: "
command = gets.chomp
case command
when /load (?<filename>\w+)/
load(filename)
end
end
Ответы
Ответ 1
named capture устанавливает локальные переменные при этом синтаксисе.
regex-literal =~ string
Dosen't устанавливается в другом синтаксисе. # См. rdoc (re.c)
regex-variable =~ string
string =~ regex
regex.match(string)
case string
when regex
else
end
Мне тоже нравятся именованные записи, но мне это не нравится.
Теперь мы должны использовать синтаксис $~ в случае.
case string
when /(?<name>.)/
$~[:name]
else
end
Ответ 2
Это уродливо, но работает для меня в Ruby 1.9.3:
while command != "quit"
print "Command: "
command = gets.chomp
case command
when /load (?<filename>\w+)/
load($~[:filename])
end
end
В качестве альтернативы вы можете использовать английское расширение $~
, $LAST_MATCH_INFO
.