OpalのPlaygroundを利用して、OpalがどのくらいのRubyっぽさを再現しているか検証します。
以下のサンプルはOpalの Playgroundで動作確認済みのプログラムです。
Opalってなんぞ?という方
こちらをどうぞ。
1. Mix-In
module Hogeable def puts_hoge puts "hoge" end end class Hoge include Hogeable end class Hige include Hogeable end Hoge.new.puts_hoge # => hoge Hige.new.puts_hoge # => hoge
2. Open Class
class String def stripe(upstart=false) i = upstart ? 0 : 1 # with_objectが動作しなかったのでカウンタを外出し self.chars.map{|e|i+=1;i.odd? ? e.upcase : e.downcase} end end puts "hoge".stripe.join # => hOgE puts "hoge".stripe(true).join # => HoGe
3. 暗黙のto_proc
暗黙のto_procって何?という方は
暗黙の to_proc で遊ぶ - tbpgr - Qiitaを参照。
puts ('a'..'z').map(&:upcase).join # => ABCDEFGHIJKLMNOPQRSTUVWXYZ
4. メタプログラミング-method_missing
class Hoge def method_missing(method_name, *args, &block) super unless method_name =~ /h.ge/ puts method_name end end hoge = Hoge.new hoge.hoge # => hoge hoge.hige # => hige hoge.hage # => hage hoge.hoo # => NoMethodError: undefined method `hoo' for #<Hoge:0x2f20>
5. メタプログラミング-動的メソッド定義
class Hoge %i(hoge hige hage).each do |e| define_method e do puts e end end end %i(hoge hige hage).each do |e| Hoge.new.method(e).call end # => hoge # => hige # => hage
6. メタプログラミング-動的クラス定義
%i(Hoge Hige Hage).each do |e| self.class.const_set e, Class.new end [Hoge, Hige, Hage].each {|e|puts e} # => Hoge # => Hige # => Hage
7. DSL向けの記述のしやすさ
module Kernel def your_name(name) @name = name end def your_age(age) @age = age end def print_you puts "#{@name}さんは#{@age}歳ですね" end end your_name 'tanaka' your_age 34 print_you #=> tanakaさんは34歳ですね
ステマ
興味があったら下記の問題もどうぞ。
Opalの基礎問題。
codeiq.jp
7月17日(金)PM8:00 締め切りです。
HubotをOpalで書く問題。
codeiq.jp
7月20日(月)PM11:45 締め切りです。