refineを使ったクラス拡張を実行コマンドでも使えるようにする
refine
を使ったクラス拡張を、実行コマンドでも使えるようにします。次のような出力をするコマンドです。
> bin/main hello
String Hello
Array Hello
パターン1
クラス拡張の影響を受けるファイルには、都度using
を記述する必要があります。
#!/usr/bin/env ruby
# bin/main
require 'thor'
require_relative '../lib/my_module'
class Command < Thor
using MyModule
desc "hello", "test method"
def hello
puts "".hello
puts [].hello
end
end
Command.start(ARGV)
外部ファイルの読み込みはrequire
にすると、エラーになります。require_relative
を使いましょう。
# lib/my_module.rb
require_relative 'array'
require_relative 'string'
module MyModule
refine Array do
def hello
"Array Hello"
end
end
end
module MyModule
refine String do
def hello
"String Hello"
end
end
end
パターン2
using MyModue
を削除してしまうと、puts MyModule.get_empty_string.hello
でエラーが起きます。
#!/usr/bin/env ruby
require 'thor'
require_relative '../lib/my_module'
class Command < Thor
using MyModule
desc "hello", "test method"
def hello
puts MyModule.string_hello
puts MyModule.get_empty_string.hello
end
end
Command.start(ARGV)
require_relative 'array'
require_relative 'string'
module MyModule
using MyModule
def self.string_hello
String.new("").hello
end
def self.get_empty_string
String.new("")
end
end