/ / No Ruby, estou capturando alguns MatchData dentro de um bloco, mas preciso dos dados fora do bloco [closed] - ruby

Em Ruby, estou capturando alguns MatchData dentro de um bloco, mas preciso dos dados fora do bloco [closed] - ruby

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 declarar foo = 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 № 1

Quando 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