Rubyでlength関数を作るのはどうすれば?
Haskell入門以前を書く時、最初RubyとHaskellでコード比較をしようと思っていて、試にlength関数を両方で作ろうと思って、以下のような関数を作ったのですが、数列はうまく動くのに、文字列を渡すとRubyからeachが無いよ!!と怒られてしまい、Haskellとの純粋な文法での比較がしたかった私は断念せざるをえなかったという事から、PythonをHaskell入門以前でのHaskellとの比較用言語に起用したという経緯があるわけですが、どなたかRubyでメソッドを使わずlength関数を作る良い方法知ってる方は居ないですかね?
やはり、Stringクラスかどうか判定して、each_charを使わないとダメでしょうか?
そんな車輪の再発明してどうなる。と言われるとなんですが・・・
def mylength (arry) sum = 0 for i in arry sum += 1 end return sum end mylength "Hello World!!"
Ruby1.9からforに文字列渡せないなら・・・もうfor自体を廃止するしか無いじゃない!!
(かと言って、Ruby1.8だと文字列をforに渡すと行毎の処理になるので、望んでる処理じゃない・・・)
2012年11月22日追記
一応、自己解決しました。
Rubyでメソッド使わずに数列も文字列も渡せるlength関数は・・・・
これです。
def mylength (arry) i = 0 while arry[i] i += 1 end return i end
何というか・・・この発想は無かった。と言いたくなるコードです。
おそらく、インデックスiが配列の範囲内に収まって、要素を見ることが出来たらTrue。見れなかったらFalseとか、そう言う事だとは思うんですが・・・
ちなみに、これと同じようにwhileで書くと、C言語は文字列はうまく動きますが、数列(int型の配列)の場合、中身が0か負の数が出るまで、配列の範囲を超えても動き続けます。(私の環境では、幸いに5要素の配列で試して、すぐに(8要素(?)目で)止まってくれましたが)
Pythonだと、そもそもエラーが出ます。
他の言語には無い、うれしい仕様のような、うれしくない仕様のような・・・