Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

JavaScriptをRubyで書けるOpalによるRuby再現度を7個のサンプルで検証する #opal #ruby

f:id:tbpg:20150629221259p:plain

OpalのPlaygroundを利用して、OpalがどのくらいのRubyっぽさを再現しているか検証します。
以下のサンプルはOpalの Playgroundで動作確認済みのプログラムです。

Opalってなんぞ?という方

こちらをどうぞ。

tbpgr.hatenablog.com

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 締め切りです。

外部資料