Имя и группа рубинового регулярного выражения

Я пытаюсь использовать именованную группу в регулярном выражении, но она не работает:

module Parser
 def fill(line, pattern)
 if /\s#{pattern}\:\s*(\w+)\s*\;/ =~ line
 puts Regexp.last_match[1]
 #self.send("#{pattern}=", value)
 end
 if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
 puts value
 #self.send("#{pattern}=", value)
 end
 end
end
</value>

Как вы можете видеть, я сначала тестирую свое регулярное выражение, а затем пытаюсь использовать такое же регулярное выражение с именованной группой.

class Test
 attr_accessor :name, :type, :visible
 include Parser #add instance method (use extend if we need class method)
 def initialize(name)
 @name = name
 @type = "image"
 @visible = true
 end
end

t = Test.new("toto")
s='desciption{ name: "toto.test"; type: RECT; mouse_events: 0;'
puts t.type
t.fill(s, "type")
puts t.type

Когда я выполняю это, первое регулярное выражение работает, но не второе с указанной группой. Вот результат:

./ruby_mixin_test.rb
image
RECT
./ruby_mixin_test.rb:11:in 'fill': undefined local variable or method 'value' for 
#<test:0x00000001a572c8> (NameError)
from ./ruby_mixin_test.rb:34:in '</test:0x00000001a572c8><main><code>'
</code> </main>
2 ответа

Если =~ используется с литералом regexp с именованными захватами, захваченные строки (или nil) назначаются локальным переменным, названным именами захвата.

/(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/ =~ " x = y "
p lhs #=> "x"
p rhs #=> "y"
</rhs></lhs>

Но - интерполяция регулярного выражения, #{}, также отключает назначение.

rhs_pat = /(?<rhs>\w+)/
/(?<lhs>\w+)\s*=\s*#{rhs_pat}/ =~ "x = y"
lhs # undefined local variable
</lhs></rhs>

В вашем случае из приведенного ниже кода:

if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
 puts value
 #self.send("#{pattern}=", value)
end
</value>

Посмотрите на приведенную ниже строку, вы используете интерполяцию

/\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
 ~~^
</value>

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


Вы не определили value в модуле

if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
 puts value # This is not defined anywhere
 [..]
</value>

licensed under cc by-sa 3.0 with attribution.