2 votes

Pourquoi l'exécuteur Rails ne reconnaît-il pas les raffinements sur Kernel ?

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)

1voto

matthewd Points 3637

Je n'ai pas été en mesure de reproduire le comportement avec le fichier de test exact que vous avez fourni (dans mon test, il a échoué immédiatement après avoir exigé config/environment (indépendamment de l'emballage de l'exécuteur), mais j'imagine que j'ai trouvé la même cause de toute façon :

Pendant l'initialisation de l'application, probablement en raison de l'utilisation de EventedFileUpdateChecker, Le noyau a été ajouté par ForkTracker. .

Vraisemblablement (et de façon compréhensible), les raffinements n'aiment pas cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X