ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

paramsキーワード(可変長パラメータ)

プログラミングC# p184

パラメータをいくつ渡してもよいメソッドを作るためのキーワード。
呼び側はパラメータ数を任意の個数設定でき、受け側は設定された個数の配列で受け取れるという仕組み。
C言語でいうprintfみたいなのを実現するために使う。

で、とりあえずサンプル書いてみる。
受け取った引数を全て足して合計を返すというメソッドを定義してみる。

using System;

class ParamsTest
{
        private static int sum(params int[] intVals)
        {
                int result = 0;
                foreach(int i in intVals)
                {
                        result += i;
                }

                return result;
        }

        static void Main(string[] args)
        {
                Console.WriteLine(sum());
                Console.WriteLine(sum(1, 2, 3));
                Console.WriteLine(sum(1, 2, 3, 4, 5));
        }
}

結果はこう。

0
6
15

引数ゼロ個も普通に動きます。


そういやJavaもJava5から出来るようになったはず。
まだ試したことないので、この際だから試してみる。

public class ParamsTest
{
        private static int sum(int... intVals)
        {
                int result = 0;
                for(int i : intVals)
                {
                        result += i;
                }

                return result;
        }

        public static void main(String[] args)
        {
                System.out.println(sum());
                System.out.println(sum(1, 2, 3));
                System.out.println(sum(1, 2, 3, 4, 5));
        }
}

可変引数に対しても、拡張for文が使えるらしい。
結果はC#版と同じ。


そういやRubyでもできたはず。
忘れたので思い出しつつ書いてみる。

def sum(*intVals)
        result = 0
        intVals.each { |i|
                result += i
        }

        return result
end

puts sum()
puts sum(1, 2, 3)
puts sum(1, 2, 3, 4, 5)

なんのことはない。簡単に出来た。
もちろん結果はC#版と同じ。


じゃあ、そもそもC言語ってどうだったんだっけ?と思い出すというか、そもそも書き方知らないので調べて書いてみる。

#include <stdarg.h>
#include <stdio.h>

int sum(int argc, ...)
{
        int result = 0;
        int i;

        va_list ptr;
        va_start(ptr, argc);

        for(i=0; i<argc; i++)
        {
                result += va_arg(ptr, int);
        }

        va_end(ptr);
        return result;
}

int main()
{
        printf("%d\n", sum(0));
        printf("%d\n", sum(3, 1, 2, 3));
        printf("%d\n", sum(5, 1, 2, 3, 4, 5));
}

なんだこれは!途端に難しいではないか!!
やっぱりC言語なんて。。
それにしても結果はC#版と同じ。

ちなみに、またもや猫でもわかるプログラミング / 第43章 可変個の引数を取る関数を参考にしました。ためになります。

C言語にすらあるってことは、どっかで役に立ちそうな機能ではあるな。