かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[Ruby]ERBがあると楽チン

Rubyを何で使ってるかというと、ERBがあるから。
ちょっとしたコードを自動生成したりするのに便利なの。

require 'rubygems'
require 'active_support'
require 'erb'

class Clazz
  attr_accessor :name
  
  def properties
    @properties || @properties = {}
  end
  def properties= value
    @properties = value
  end
  
  TEMPLATE = File.open("template.erb") { |f| f.read }
  ERB.new(TEMPLATE, nil, '-').def_method(self, "to_code")
end

clazz = Clazz.new
clazz.name = "Taro"
clazz.properties["name1"] = "int"
clazz.properties["name2"] = "String"

puts clazz.to_code

こんな感じのRubyのコードと

public class <%= @name %>
{
<%- @properties.each do |name,type| -%>
  private <%= type %> <%= name %>;
  public void set<%= name.capitalize %>(<%= type %> <%= name %>) {
    this.<%= name %> = <%= name %>;
  }
  public <%= type %> get<%= name.capitalize %>() {
    return this.<%= name %>;
  }
<%- end -%>
}

こんなtemplate.erbってファイルを用意して実行すると

public class Taro
{
  private int name1;
  public void setName1(int name1) {
    this.name1 = name1;
  }
  public int getName1() {
    return this.name1;
  }
  private String name2;
  public void setName2(String name2) {
    this.name2 = name2;
  }
  public String getName2() {
    return this.name2;
  }
}

こんなコードの出来上がり。

ん~…コードジェネレーションのコードのほうが長い!!!!
これに、ちょちょいと手を入れてみる。Clazzの定義をYAMLファイルに記述して、そこからデシリアライズしたものに対してto_codeをかけてみるように改造。

main.rb

require 'rubygems'
require 'active_support'
require 'erb'
require 'yaml'

class Clazz
  attr_accessor :name
  
  def properties
    @properties || @properties = {}
  end
  def properties= value
    @properties = value
  end
  
  TEMPLATE = File.open("template.erb") { |f| f.read }
  ERB.new(TEMPLATE, nil, '-').def_method(self, "to_code")
end

classes = YAML::load_file('clazz.yml')
classes.each do |clazz|
  puts clazz.to_code
end

clazz.ymlは、ためしに下のように定義してみた。

- !ruby/object:Clazz
  name: Taro
  properties: 
    name1: int
    name2: String
- !ruby/object:Clazz
  name: Jiro
  properties: 
    name1: int
    name2: String
- !ruby/object:Clazz
  name: Sabu
  properties: 
    foo: int
    bar: String
    baz: Taro

これを実行すると、今度は自動生成されるコードのほうが長くなってきたかな?

public class Taro
{
  private int name1;
  public void setName1(int name1) {
    this.name1 = name1;
  }
  public int getName1() {
    return this.name1;
  }
  private String name2;
  public void setName2(String name2) {
    this.name2 = name2;
  }
  public String getName2() {
    return this.name2;
  }
}
public class Jiro
{
  private int name1;
  public void setName1(int name1) {
    this.name1 = name1;
  }
  public int getName1() {
    return this.name1;
  }
  private String name2;
  public void setName2(String name2) {
    this.name2 = name2;
  }
  public String getName2() {
    return this.name2;
  }
}
public class Sabu
{
  private Taro baz;
  public void setBaz(Taro baz) {
    this.baz = baz;
  }
  public Taro getBaz() {
    return this.baz;
  }
  private int foo;
  public void setFoo(int foo) {
    this.foo = foo;
  }
  public int getFoo() {
    return this.foo;
  }
  private String bar;
  public void setBar(String bar) {
    this.bar = bar;
  }
  public String getBar() {
    return this.bar;
  }
}

意外とお手軽にできちゃうのが素敵。

投稿日時 : 2008年3月7日 0:54

Feedback

# re: [Ruby]ERBがあると楽チン 2008/03/07 8:07 myugaru

うーん!なんかずるーい(≧ヘ≦ )
でもこっそり勉強しよっかなとも思ったりしました。

# re: [Ruby]ERBがあると楽チン 2008/03/07 9:53 かずき

書いといて何ですけど、あまり自動生成をやることないですよ(笑)

自分しか使わないツールとかワンライナーでコマンドラインから使ったりするくらいです。
でも、Linuxのコマンドとかの組み合わせでできるようなことをワザワザRubyで書いてるので無駄っぽいというのは秘密。
(Linuxのコマンドとかあんまり知らないんで…)

# re: [Ruby]ERBがあると楽チン 2008/03/10 18:01 かずき

@properties || @properties = {}は@properties ||= {}と書くほうが冗長じゃなくていい。

# [WPF][C#]ViewModelの実装ってめんどくさいよね!!だから、自動生成しちゃおう 2009/03/22 12:34 かずきのBlog

[WPF][C#]ViewModelの実装ってめんどくさいよね!!だから、自動生成しちゃおう

# sac longchamp 2012/10/19 15:25 http://www.sacslongchamppascher2013.com

I truly enjoy studying on this web site, it has fantastic articles. "A short saying oft contains much wisdom." by Sophocles.

# supra uk 2012/12/08 3:54 http://supratkstore1.webs.com/

Simply a smiling visitant here to share the love (:, btw outstanding design. "Treat the other man's faith gently it is all he has to believe with." by Athenus.

# cuir longchamps 2012/12/14 23:00 http://www.saclongchampachete.com/category/sacs-lo

make these products red having a yellow indy!!

# soldes longchamp 2012/12/16 22:11 http://www.soldesacslongchamp.info/category/kate-m

If these sound wonderful I'd definitely wear these in the home.

# femme burberry solde 2012/12/17 8:14 http://www.sacburberryecharpe.fr/category/burberry

If an individual's photostream has photos which will - when good and not : triggered the spirited comments¡ä carefully thread.

# echarpe burberry 2012/12/17 21:21 http://www.sacburberryecharpe.fr/category/echarpe-

Very valuable info. Hope to check out more content soon!

タイトル  
名前  
Url
コメント