目次

4.  数と文字列の変換

 

いままで、2種類のオブジェクトについて見て来ました。 (文字列です。) そして、それらを指し示す変数を作りました。 次にしたいことは、これらを一緒にしてうまいこと出来ないかと言うことです。

プログラムを使って画面に25と表示させるつもりで、次のようにしても うまくは行かない というのは分かりますね。 つまり、数と文字列とを加え合わせることはできないということです。

var1 = 2
var2 = '5'

puts var1 + var2

ここで問題なのは、このプログラムが7 (2 + 5)を表示させようと しているのか、25 ('2' + '5')を表示させようとしているのかを コンピュータが知るすべがないことです。

この2つのものを加え合わせる前に、何らかの方法でvar1を文字列にしたものか、 あるいは、var2を整数にしたものかを得る必要がありそうです。

変換

あるオブジェクトを文字列にしたものを得るには、単にその終わりに .to_s を書き足します。

var1 = 2
var2 = '5'

puts var1.to_s + var2
25

また、同様にオブジェクトを整数にしたものを得るにはto_i を、 浮動小数点数にしたものを得るにはto_f を使います。 では、これら3つのメソッドが何を行うのか、 (あるいは何を行わない のか)をもう少し詳しく見てみましょう。

var1 = 2
var2 = '5'

puts var1.to_s + var2
puts var1 + var2.to_i
25
7

to_s を呼んで var1 を文字列にした後でも、 var1 は常に 2 を指し続けており、決して '2' にはなって いないことに注意してください。var1 は明示的に再代入をしない限り、 (そのためには必ず=記号が必要です。)また、プログラムが終了しない限り 2 を指し続けます。

では、いくつかの面白い(そして少し込み入った)変換の例を見てみましょう。

puts '15'.to_f
puts '99.999'.to_f
puts '99.999'.to_i
puts ''
puts '5 は僕の好きな数!'.to_i
puts '誰から 5が好きだってきいたの?'.to_i
puts '君のママからだよ'.to_f
puts ''
puts '文字列っぽい'.to_s
puts 3.to_i
15.0
99.999
99

5
0
0.0

文字列っぽい
3

結果を見て少しびっくりしましたか? 最初の例はまったく問題ないですね。 15.0を返しています。 その次は文字列'99.999'を浮動小数点数と整数に変換しています。 小数に関しては期待通りだと思いますが、整数では例のごとく丸めて切り捨てられ ています。

次は、数に変換しようとする幾分...普通ではない 文字列の例をあげました。 to_ito_f では理解し得ない最初の文字が出た時点で それ以降の文字列を無視します。 ですので、最初の例では5に変換しますが、そのあとの2つの例では、 数字以外の文字から始まっているためすべて無視されて...、コンピュータは ゼロを返しています。

最後の2つの例では、期待通り、変換のメソッドはまったく何も行いません。

putsに対するもうひとつの見方

さて、私たちのお気に入りのメソッドについては何か変なところが あるようです。見てみましょう。

puts 20
puts 20.to_s
puts '20'
20
20
20

なぜこの3つは同じ出力なのでしょうか。 後の方の2つに関しては、20.to_s '20'のことなので、 このように表示されるのは当然です。 では、最初の20 という整数についてはどうでしょう。それを言うなら、 整数の 20 を表示させるとは何を意味しているのでしょう。 たとえば、あなたが紙片に 2 と書いて、その後に続けて 0と 書いた場合それは文字列を書いたのでしょうか。それとも整数を書いたのでしょうか。 整数の 20というのは、私の手と足にある指の合計の数であって、 20 でできた文字列のことではありません。

さてここで、いままで慣れ親しんできた puts に潜む重大な秘密を披露しましょう。 puts がオブジェクトを表示する時には、その前に密かに to_s を使ってそのオブジェクトを文字列に変換していたのでした。 実際、puts の最後についている s は、string (文字列) の sです。実は、putsput string という意味だったのです。

今のところ、このことはそれほどすごいと思うようなことではないかもしれませんが、 Rubyには非常に多種多様な オブジェクトがあって、 (自分でオブジェクトを作る方法もこれから習っていきますよ!) 複雑なオブジェクトをputsするだけで、それが何なのかわかる...、 たとえば、おばあちゃんの写真だったり、音楽のファイルだったり、が わかるというのは素晴らしいことなのです。この辺に関してはまた後ほど説明します。

とりあえずは、いくつかの新しいメソッドを覚えて、楽しいプログラムを書けるように していきましょう。

メソッド getschomp

もしputsput string という意味であるというなら、 getsは何の略なのか当てられますね。putsがいつも文字列を 出力するのと同様にgetsは文字列の入力だけをします。といっても、 どこから文字列を受け取るのでしょう。

それはあなたからです。もう少し正確に言えばあなたのキーボードから。 キーボードは文字列を打つことしかできませんから、これは十分にうまく働く わけです。実際何が起こるかというと、getsはその場で止まって あなたがEnterキーを押すまであなたがキーボードから打ったものを 読み続けます。さて、では、試してみましょう。

puts gets
もしもし聞こえますかぁ?
もしもし聞こえますかぁ?

もちろん、何をタイプしようと復唱されてきます。 何度か実行して違うものを入力してみてください。

さぁ、これでインタラクティブなプログラムが作れるようになりました! 次に示すのは、名前をタイプしてもらって、それにあいさつを返すプログラムです。

puts 'こんにちは! 君の名前は何かな?'
name = gets
puts '君の名前は ' + name + 'だね. 良い名前じゃないか!'
puts 'よろしく, ' + name + '.  :)'

あれっ! このプログラム実行して—、名前を入れて...、結果を見てください。

こんにちは! 君の名前は何かな?
Chris
君の名前は Chris
だね. 良い名前じゃないか!
よろしく, Chris
.  :)

んー。どうやら C, h, r, i, s, というように文字を入力していって最後にEnterを 押したところ、getsは私の名前 Enterを すべて取り込んでしまったようです。 でも、幸いなことに、こんなときに使えるメソッドがあるんです。chompといいます。 このメソッドは文字列の最後にぶら下がっているどんなEnterも取り去る 働きがあります。 では、今度はchompを使ってこのプログラムをもう一度書き直してみましょう。

puts 'こんにちは! 君の名前は何かな?'
name = gets.chomp
puts '君の名前は ' + name + 'だね. 良い名前じゃないか!'
puts '会えてうれしいよ, ' + name + '.  :)'
こんにちは! 君の名前は何かな?
Chris
君の名前は Chrisだね. 良い名前じゃないか!
会えてうれしいよ, Chris.  :)

これでうまくいきました。ここで、namegets.chomp を 指し示すようにしたので、あとから、name.chomp とする必要がないことに 注意してください。つまり、name はすでに chomp されているのです。

練習問題

• 最初に姓、次に名前を聞いて、最後にフルネームに対してあいさつを するようなプログラムを書いてみましょう。

• 好きな数を入力してもらい、それに1を加えて、その結果を ベターな 数字として薦めるプログラムを書きましょう。 (機転の利いたサジェスチョンに努めましょう。)

さて、この2つのプログラムを書き終えたら(そしてその他にもいくつか試してみたら) メソッドについて、さらに学んでいきましょう。

 

目次