アニメ『ソウルイーターノット!』 (2014)
ノット!だけでなく、どこまで見たのか忘れてしまったので、ソウルイーターから見直しています。
カッコいいです、ソウルイーター。
ネーミングセンスも好みです。特にデスサイズ。言葉の響きにぞくぞくします。デスとサイズを合わせてデスサイズだと思いますが、ぜんぜんサイズという意味ではないところがカッコいい。
例えるなら、メトロとポリスを合わせると、メトロポリスですが、ぜんぜんポリスの意味ではない感じと似てる(そもそもmetropolisなので、ポリス(警察)ではないですが)
(後で知りましたが、サイズは、sizeではなく、scythe(大鎌)でした)
今回はデスサイズではなく、サイズ、レングスのネタです。
文字列の長さ、配列の要素数、リストの要素数等、長さや数を求めるプロパティやメソッドって、sizeだったか、lengthだったか、はたまたcountだったか。いつも迷ってしまいます。
迷い始めたのは、Javaでプログラムするようになってからと記憶してます。ずっと、迷わせる言語設計の方がおかしいと思ってたんですが、名が体を表さない言葉があると気づかされたおかげで、そもそも最初の覚え方が悪いのかもしれない、じゃあ覚え直そうと思い立ちました。
今回は、文字列長のメソッド(関数またはプロパティ)名を覚える方法を考えてみます。
おそらく迷うのは、size、length、count、このあたりだと思いますので、それぞれの意味から考えます。
まず、length。
lengthは、=長さ、なので一次元の物を扱うものだ、と記憶しておきます。そう覚えると、文字列長も同様に、=長さ、なので、lengthは文字列長としてしっくりきます。
次に、size。
服のサイズを思い浮かべます。=大きさ、です。
先ほど記憶した通り、文字列長は、=長さであり、大きさではありません。sizeはしっくりきません。
次にcount。
=数える、と記憶してしまいましょう。countが求めるのは「数」です。
仮に文字列長が、文字列数というのなら、countはピッタリきますが、「数」でなく「長」なので、countは文字列長にはハマりません。
このように考えると、文字列長は、lengthのみが当てはまります。
まあ、覚え方の一つなので、どんな言語にも当てはまるというわけではありません。
例えば、Io言語では、文字列長を取得するためのメソッドは、はsizeなので、また別の覚え方を考えねばなりません。例外もあるということは頭に入れておきます。
では、awk perl ruby python java C#において、文字列長を取得するサンプルを見ていきましょう。
まずは、awk。
takk@deb9:~/tmp$ awk 'BEGIN{ print length("abcdef") }' 6 takk@deb9:~/tmp$
awkは、オブジェクト思考ではないので、length関数です。
次はPerl。awkの文法と似てますね。length関数です。
takk@deb9:~/tmp$ perl -E 'say length "abcdef"' 6 takk@deb9:~/tmp$
Ruby。Rubyは、なんとlenghtメソッドでも、sizeメソッドでもいけます。いろんな方法を許容しているのでしょうか。
takk@deb9:~/tmp$ irb irb(main):001:0> p "abcdef".length() 6 => 6 irb(main):002:0> p "abcdef".size() 6 => 6 irb(main):003:0>
次はPython。ん~。lengthという綴りではなく、lenなんです。
しかもオブジェクト指向言語なのに、文字列自身のメソッドとして呼び出しするわけではないんです。まあ、Pythonの流儀があるのだろうけど。
>>> length("abcdef") Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'length' is not defined >>> len("abcdef") 6 >>>
次はJava。lengthメソッドですね。覚えやすいです。
takk@deb9:~/tmp$ cat t.java import java.io.*; class Test{ public static void main(String args[]){ String s = "abcdef"; System.out.println( "" + s.length() ); } } takk@deb9:~/tmp$ javac t.java takk@deb9:~/tmp$ java Test 6 takk@deb9:~/tmp$
C#です。Linux上で確認したのでmonoで実行しました。
takk@deb9:~/tmp$ sudo apt-get install mono-devel 省略 takk@deb9:~/tmp$ cat t.cs class Test { static void Main() { string s = "abcdef"; System.Console.WriteLine(s.Length); } } takk@deb9:~/tmp$ mcs t.cs takk@deb9:~/tmp$ mono t.exe 6 takk@deb9:~/tmp$
C#の場合、Lengthではあるけれど、メソッドではなくプロパティなんですね。
なんで!?
まあこれも、C#の言語仕様なんでしょう。本来文字列長というものは、ふるまい(メソッド)で得るものではなく、文字列は長さが決まっているものなので、プロパティで得るという考え方もアリかと思います。
でも、覚えにくいですね。
コメント