かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

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

書庫

日記カテゴリ

delegateもどきと同じようなコードをC#,Java,Rubyで書いてみた

επιστημηさんの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

Feedback

# re: delegateもどきと同じようなコードをC#,Java,Rubyで書いてみた 2007/12/31 0:16 επιστημη

...なんかくやしい...

# re: delegateもどきと同じようなコードをC#,Java,Rubyで書いてみた 2007/12/31 0:29 かずき

すいませんorz

# re: delegateもどきと同じようなコードをC#,Java,Rubyで書いてみた 2007/12/31 11:20 凪瀬

delegateに比べinterfaceはちょっと大掛かりだからなぁ。
interfaceまでは必要ない、delegateで十分というシチュエーションでは有用かもしれないなぁ。

# XwZVRgqMGRBRJMGq 2011/11/28 19:39 http://catalinabiosolutions.com

Gripping! I would like to listen to the experts` views on the subject!!...

# Burberry Ties 2012/10/24 22:48 http://www.burberryoutletonlineshopping.com/burber

I gotta favorite this internet site it seems very beneficial very beneficial
Burberry Ties http://www.burberryoutletonlineshopping.com/burberry-ties.html

# Burberry Watches 2012/10/24 22:48 http://www.burberryoutletonlineshopping.com/burber

I dugg some of you post as I thought they were handy handy
Burberry Watches http://www.burberryoutletonlineshopping.com/burberry-watches.html

# burberry wallets 2012/10/24 22:49 http://www.burberryoutletonlineshopping.com/burber

I like this post, enjoyed this one regards for posting. "The reward for conformity was that everyone liked you except yourself." by Rita Mae Brown.
burberry wallets http://www.burberryoutletonlineshopping.com/burberry-wallets-2012.html

# t shirt scarf 2012/10/24 22:50 http://www.burberryoutletonlineshopping.com/burber

What i do not realize is in fact how you're no longer actually a lot more well-favored than you might be right now. You are very intelligent. You recognize thus significantly on the subject of this topic, made me for my part believe it from so many numerous angles. Its like men and women are not fascinated except it is one thing to accomplish with Woman gaga! Your own stuffs outstanding. Always handle it up!
t shirt scarf http://www.burberryoutletonlineshopping.com/burberry-scarf.html

# pYCjxhCtbTpvCt 2021/07/03 2:08 https://amzn.to/365xyVY

very good publish, i actually love this web site, keep on it

# PUMqLPJrtJ 2021/07/03 3:39 https://www.blogger.com/profile/060647091882378654

to this fantastic blog! I guess for now i all settle for book-marking and adding your RSS feed to my Google account.

タイトル
名前
Url
コメント