module RefineModule
refine String do
def hello
puts "#{self} hello"
end
end
end
class Foo
using RefineModule
def hello_foo
"Foo".hello
end
end
class Bar
def hello_bar
"Bar".hello
end
end
class Bar
using RefineModule
def hello_bar2
"Bar".hello
end
end
Foo.new.hello_foo
Bar.new.hello_bar2
Bar.new.hello_bar
Foo hello Bar hello
NoMethodError: undefined method `hello' for "Bar":String <main>:17:in `hello_bar' <main>:31:in `<main>' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `load' /Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `<main>'
Bar.class_eval do
using RefineModule
def hello_bar3
"Bar".hello
end
end
Bar.new.hello_bar3
Bar hello
Bar.class_eval <<-EOC
using RefineModule
def hello_bar4
"Bar".hello
end
EOC
Bar.new.hello_bar4
Bar hello
module RefineModule
refine String.singleton_class do
def hello
puts "#{self} hello class"
end
end
end
class Foo
using RefineModule
def hey
String.hello
end
end
Foo.new.hey
String.hello
String hello class
NoMethodError: undefined method `hello' for String:Class <main>:17:in `<main>' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `load' /Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `<main>'
puts `cat 071/refine_module4.rb`
require_relative './create_proc' module RefineModule refine String do def hello puts "#{self} hello" end end end using RefineModule pr = create_proc pr.call
puts `bash -c "ruby 071/refine_module4.rb 2>&1"`
/Users/ariga/src/kawasakirb/meetups/pruby/071/create_proc.rb:2:in `block in create_proc': undefined method `hello' for "joker1007":String (NoMethodError) from 071/refine_module4.rb:14:in `<main>'
module RefineModule
refine String do
def hello
puts "#{self} hello"
end
end
end
class Foo4
using RefineModule
def hey
["suginoy", "pera"].each(&:hello)
end
def hey2(arg1)
arg1.hello
end
end
# Ruby 2.5: ok
Foo4.new.hey
Foo4.new.hey2("suginoyyyyyyyyyyyy!")
suginoy hello pera hello suginoyyyyyyyyyyyy! hello
Refinementsは用法用量を守って正しくお使いください
次回、 "7-3 BasicObject#mthod_missing" から