From: duncan.macgregor@... Date: 2018-01-16T17:23:10+00:00 Subject: [ruby-core:84893] [Ruby trunk Bug#14364] Regexp last match variable in procs Issue #14364 has been reported by aardvark179 (Duncan MacGregor). ---------------------------------------- Bug #14364: Regexp last match variable in procs https://bugs.ruby-lang.org/issues/14364 * Author: aardvark179 (Duncan MacGregor) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- While working on TruffleRuby's regexp variables implementation I found the following behaviour when comparing our behaviour with MRI 2.3.5 and 2.5.0. Some core methods such as `String#scan` take an optional block argument, and if this is a literal block then each time it is yielded to the `$~` variable will have been set. However, if the block is a proc that was not defined in the caller's scope then `$~` does not appear to get set or is inaccessible. The following test script demonstrates the problem. ~~~ ruby class ScanChecker def block Proc.new do puts "$~ is #{$~}" end end end puts 'Checking with literal block.' 'hello'.scan(/l/) do puts "$~ is #{$~}" end puts 'Checking with a Proc from same scope' my_proc = Proc.new do puts "$~ is #{$~}" end 'hello'.scan(/l/, &my_proc) puts 'Checking with a Proc.' checker = ScanChecker.new 'hello'.scan(/l/, &checker.block) ~~~ I would have expected the `$~` to be set in all cases, but I'm not sure if that is the intended behaviour. -- https://bugs.ruby-lang.org/ Unsubscribe: