かずきのBlog
C#やJavaやRubyとメモ書き

目次

Blog 利用状況
  • 投稿数 - 426
  • 記事 - 1
  • コメント - 461
  • トラックバック - 112
ニュース
  • 思い出は、いっぱい。
コメント
プログラマ的自己紹介
  • C#とRubyを趣味で。Javaを仕事で使ってやってます。 WPFをコツコツ勉強中。 IDE大好き。Visual Studio, Eclipse, NetBeansを使用中
お気に入りのツール/IDE
  • Visual Studio 2008 std
  • Eclipse
  • NetBeans6.0以降
  • 自作のツール
プロフィール
  • 大田 一希
  • 1981年1月30日産まれ
  • AB型
  • 左利き
経歴
  • 1993年 海田中学校 入学
  • 1996年 広島県立安芸南高等学校 入学
  • 1999年 某大学 環境情報学科 入学
  • 2003年 某大学 大学院 環境学研究科 入学
  • 2005年 就職して上京
  • 今に至る
アクセサリ
  • あわせて読みたい
  • ログ解析ネット証券

書庫

日記カテゴリ

 

επιστημηさんのBlogのdelegateもどきにあるコードと同じ動きをするものをC#とJavaとRubyで書いてみた。

まずは、C#。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Deleg
{
    static class Utils
    {
        public static int Add(int x, int y) { return x + y; }
        public static int Time2(int x) { return Add(x, x); }
    }

    class Bias
    {
        int value_;
        public Bias(int n) { value_ = n; }
        public int Value(int x) { return value_ + x; }

    }

    class Program
    {
        static void Main(string[] args)
        {
            // fはintを引数とし、intを返す
            Func<int, int> f;
            f = Utils.Time2;
            Console.WriteLine(f(3)); // 3 + 3 = 6

            // Addの第二引数を4に固定
            f = (x) => Utils.Add(x, 4);
            Console.WriteLine(f(3)); // 3 + 4 = 7

            Bias b = new Bias(10);
            // インスタンスメソッドだからって特にC#ではC++と違って意識することはない
            f = b.Value;
            Console.WriteLine(f(2)); // b.Value(2) = 12
        }
    }
}
もともとのネタがdelegateを使ったコードがあるのを前提にしてあるから、すっきりと移植完了。
tr1::bindは、ラムダ式で代用してみた。
続いてJava。最近NetBeans6を使ってる。Eclipseを起動してないなぁ…。と感慨にふけってみたけど、感慨にふけってもまだNetBeans6は立ち上がらない。
もうちょいここらへんの起動スピードあがってほしいと思う今日この頃でした。
package deleg; 

public class Main {

    static int add(int x, int y) { return x + y; }
    static int time2(int x) { return add(x, x); }
    static class Bias {
        int value_;
        public Bias(int x) {
            value_ = x;
        }
        public int value(int x) { return value_ + x; }
    }
    // delegateないしなぁ…
    static interface Func {
        int exec(int x);
    }

    public static void main(String[] args) {
        Func f;
        // 無名クラス?でお茶を濁す
        f = new Func(){ public int exec(int x) { return time2(x); } };
        System.out.println(f.exec(3)); // 3 + 3 = 6
        // 第二引数を固定と言われても…
        f = new Func() { public int exec(int x) { return add(x, 3); } };
        System.out.println(f.exec(3)); // 3 + 4 = 7
        // finalじゃないと無名クラスのメソッドから参照できないんです
        final Bias b = new Bias(10);
        f = new Func() { public int exec(int x) { return b.value(x); } };
        System.out.println(f.exec(2)); // b.value(2) = 12
    }

}

こちらは、Delegateみたいなものや関数ポインタみたいなものがJava6までには無い(Java7で出来るのかな)ので無名クラスを使ってお茶を濁した。
同じ事が実現できてはいるけど、ちょっと記述がまどろっこしい。

次はRuby。
こちらは、Procあたりを使うとさくっとできる。
これも、引き続きNetBeans6で作ってみた。起動に時間がかかったりするけど、IDEがあると補完とかがきいて楽チン。

def add x, y
  x + y
end

def time2 x
  add x, x
end

class Bias
  def initialize x
    @value = x
  end
  def value x
    @value + x
  end
end

# こういうのはlambda使うのかな…自身が無い
f = lambda {|x| time2 x}
puts f.call(3) # 3 + 3 = 6

# addの第二引数を4に固定
f = lambda {|x| add x, 4 }
puts f.call(3) # 3 + 4 = 7

b = Bias.new 10
f = lambda {|x| b.value(x)}
puts f.call(2) # b.value(2) = 12

Rubyも確か、関数ポインタやdelegateにあたるような概念は言語仕様になかったような気がする…(気がするだけ!)
lambdaを使って、Procクラスのオブジェクトをこさえてやることでいける。
こちらも割りとすっきり書けたような気がする。どうだろうか。

投稿日時 : 2007年12月30日 22:46
コメント
  • # re: delegateもどきと同じようなコードをC#,Java,Rubyで書いてみた
    επιστημη
    Posted @ 2007/12/31 0:16
    ...なんかくやしい...
  • # re: delegateもどきと同じようなコードをC#,Java,Rubyで書いてみた
    かずき
    Posted @ 2007/12/31 0:29
    すいませんorz
  • # re: delegateもどきと同じようなコードをC#,Java,Rubyで書いてみた
    凪瀬
    Posted @ 2007/12/31 11:20
    delegateに比べinterfaceはちょっと大掛かりだからなぁ。
    interfaceまでは必要ない、delegateで十分というシチュエーションでは有用かもしれないなぁ。
タイトル  
名前  
Url
コメント