From: Tadashi Saito Date: 2010-01-12T01:14:08+09:00 Subject: [ruby-dev:40038] str_strlen() の公開名 (was Re: Re: [Feature #2571] 文字列のハミング距離) 斎藤と申します。一介のlibrubyユーザーです。 タイミングが悪く議論に遅れてしまい、ごめんなさい。 On Mon, 11 Jan 2010 16:35:19 +0900 Yukihiro Matsumoto wrote: > そうですね。コミットしてください。 コミットされてしまったようですが、自分はあまりよい名前でないと思います。 先ほど見たところによると、rb_str_length()という、rb_str_strlen()にとても良く似た 関数が既に公開されているようでした。C APIユーザならば、このように名前や意味が似通った 関数があれば、まずそれとの違いを意識したり、時には混同したりすることが予想できます。 より正確を期すと、rb_str_length(str)とLONG2NUM(rb_str_strlen(str))は等価なよう です。つまり両者の違いは、VALUEが返ってくることや、その変換コストがかかることだと 思います。 このような意味の違いが、"length"と"strlen"という名前の違いで表現できているとは、自分 には感じられません。またstrlenというのは、おそらくstring lengthの略であり、 str_lengthと同じことを言い換えているだけですから、やはり意味の違いは伝わらないのでは ないでしょうか。 さらには「strlen(3)という有名なCの関数があるのだから、foo_strlen()という名前を 付ければ、返り値がCネイティブである事が類推できるはずだ」という反論もあり得ると思い ます。しかしCで有名な関数名が、そのままRubyのメソッド名として多数採用されているのは 事実なので、(prefixを無視した部分の)名前のみによってRubyレイヤーとCレイヤーを区別する のはもう困難でしょう。よって、この反論にはあまり説得力がないと考えます。 そういうことで自分は、rb_str_strlen()よりも、例えば ・rb_str_length_long (型を名前に埋め込んでしまえば分かりやすいから) ・rb_str_length_raw (VALUEに包まない「生」の値だから) ・rb_str_length_direct (LONG2NUMという変換を通さない「直接」の結果だから) ・rb_str_c_length (Cで直接扱える値が返るから) といったような「rb_str_length + α」の名前の方が望ましいと思いますが、どうで しょう。 これは、既存の関数と意味が似ているのならば名前も似せて、意味が異なる部分を名前にも 差分として反映させれば、C APIユーザとってはより分かりやすくなると感じるからです。 # ……というような議論は、Rubyのライブラリなら日常茶飯事なのに、C APIとなると # あんまりないものですね。 もっとも、毎回 len = NUM2LONG(rb_str_length(s)) とか書くのはたしかにちょっと 面倒くさいですし、速度も多少落ちてしまうと思うので、こういう関数が公開される事自体は 賛成です。 -- 斎藤ただし