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