文字列長ってsize?length?


アニメ『ソウルイーターノット!』 (2014)

ノット!だけでなく、どこまで見たのか忘れてしまったので、ソウルイーターから見直しています。カッコいいです、ソウルイーター。ネーミングセンスも好みです。特にデスサイズ。言葉の響きにぞくぞくします。デスとサイズを合わせてデスサイズだと思いますが、ぜんぜんサイズという意味ではないところがカッコいい。例えるなら、メトロとポリスを合わせると、メトロポリスですが、ぜんぜんポリスの意味ではない感じと似てる(そもそもmetropolisなので、ポリス(警察)ではないですが)

今回はデスサイズではなく、サイズ、レングスのネタです。
文字列の長さ、配列の要素数、リストの要素数等、長さや数を求めるプロパティやメソッドって、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#の言語仕様なんでしょう。本来文字列長というものは、ふるまい(メソッド)で得るものではなく、文字列は長さが決まっているものなので、プロパティで得るという考え方もアリかと思います。
でも、覚えにくいですね。