J'ai découvert que si le code est exécuté dans un Exécutant Rails les raffinements ne sont pas reconnus. Il ne semble pas que ce soit à cause des blocs ou des procs, ce qui était ma seule hypothèse. Voici un peu de code de démonstration :
require './config/environment.rb'
module ExammpleRefinement
refine ::Kernel do
def say_hello
puts "hello"
end
end
end
using ExammpleRefinement
puts "alone"
say_hello
puts "block"
loop do
say_hello
break
end
puts "proc"
Proc.new{say_hello}.call
puts "rails executor"
::Rails.application.executor.wrap do
say_hello
end
courir avec ruby example.rb
(on ne peut pas le faire avec rails runner
parce qu'à partir de rails 7, l'intégralité du script est enveloppée dans un exécuteur, ce qui ruine l'expérience).
alone
hello
block
hello
proc
hello
rails executor
Traceback (most recent call last):
2: from example.rb:25:in `<main>'
1: from ....rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/activesupport-7.0.4/lib/active_support/execution_wrapper.rb:92:in `wrap'
scripts/example.rb:26:in `block in <main>': undefined local variable or method `say_hello' for main:Object (NameError)