Normalmente, eu declararia a variável fora do bloco, mas você não pode declarar uma variável MatchData. Eu posso fazer isso consultando uma correspondência (por exemplo, foo = "hi".match(/hi/)
) mas isso parece meio pateta?
Editar: A pergunta foi colocada em espera, para ficar claro, meu objetivo era capturar o resultado de uma
.match
ligar para fora de um bloco. A resposta simples foi declararfoo = nil
fora do bloco, pois você não precisa definir o tipo var. Também foi útil descobrir que os resultados são armazenados imediatamente em$~
,$1
,$2
etc. (desculpe, isso foi um pouco reparador!)
Respostas:
1 para resposta № 1Quando você declara uma variável em ruby, não precisa declarar seu tipo, você pode simplesmente dizer que é nil
, e deve funcionar bem:
my_match = nil
"hi there".tap do |x|
my_match = x.match /hi/
end
puts my_match
# => hi
0 para resposta № 2
Você pode fazer MatchData.new
se é isso que você quer dizer, Ruby relata um método indefinido "new
" para MatchData::Class
. Por quê? Porque, em essência, MatchData é uma variável:
MatchData é o tipo da variável especial $ ~,e é o tipo de o objeto retornado por Regexp # match e Regexp.last_match. isto encapsula todos os resultados de uma correspondência de padrões, resultados normalmente acessado pelas variáveis especiais $ &, $ ", $`, $ 1, $ 2 e assim por diante.
Tente isto:
"string" =~ /s(tr)(ing)/
p $~ #=> #<MatchData "string" 1:"tr" 2:"ing">
p $1 #=> tr
p $2 =#> ing
Se você quiser referenciar a variável de dados de correspondência em algo mais legível, basta:
"string" =~ /s(tr)(ing)/
foo = $~
p foo #=> #<MatchData "string" 1:"tr" 2:"ing">
p foo == $~ #=> true