Использование 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.