Rubyにおいて、データ型を変換する方法
はじめに
1つのオプションで以下の文を日本語で言い換える:それぞれの作成するプログラムには複数のデータ型が含まれますが、同じデータ型内で一般的に操作を行うことが重要です。つまり、数値に対して数学的な操作を行ったり、文字列を結合したりします。
データは時にはキーボード、APIの応答、またはデータベースなど、外部のソースからもたらされることがあります。それを使用できるようにするために、変換する必要があります。Rubyには、値を異なるデータ型に変換するためのいくつかのメソッドが用意されています。このチュートリアルでは、文字列を数値に変換したり、オブジェクトを文字列に変換したり、文字列を配列に変換したり、文字列とシンボルの間で変換する方法を学びます。
文字列を数値に変換する
Rubyは文字列を数値に変換するためのto_iとto_fのメソッドを提供しています。to_iは文字列を整数に変換し、to_fは文字列を浮動小数点数に変換します。
"5".to_i # 5
"55.5".to_i # 55
"55.5".to_f # 55.5
これを証明するために、2つの数字を求め、その合計を表示する小さなプログラムを作成してください。以下のコードを持つ新しいRubyプログラム、adder.rbを作成してください。
「adder.rbを追加する」
print "What is the first number? "
first_number = gets.chop
print "What is the second number? "
second_number = gets.chop
sum = first_number + second_number
print sum
プログラムを実行すると、予期しない答えが表示されることがあります。
- ruby adder.rb
What is the first number? 5 What is the second number? 5 55
このプログラムは、5と5の合計が55であると述べています。それが正しくないことは分かっていますが、コンピューター自体は間違っていません。プログラムは2つの数字を求めたが、あなたはキーボードでそれらを入力しました。数字の5を送信したわけではありません。代わりに文字”5″を送信しました。言い換えると、あなたのプログラムは両方の入力を文字列として見たので、文字列”5″と”5″を足し合わせると新しい文字列”55″が得られます。
これを避けるために、両方の文字列を数値に変換してください。to_fメソッドを使用して、両方の数値を浮動小数点数に変換するようにプログラムを修正してください。
print "What is the first number? "
first_number = gets.chop
print "What is the second number? "
second_number = gets.chop
# convert strings to numbers
first_number = first_number.to_f
second_number = second_number.to_f
sum = first_number + second_number
print sum
プログラムをもう一度実行する。
- ruby adder.rb
今回の出力は異なるものになります。 (Konnokai no shutsuryoku wa kotonaru mono ni narimasu.)
What is the first number? 5 What is the second number? 5 10.0
5と5を入力すると、10.0となります。
文字列が数値ではない場合、to_iメソッドとto_fメソッドにはいくつかの興味深い挙動があります。例えば、
"123-abc".to_i
123
この例では、文字列「123-abc」を整数に変換すると、整数の「123」が得られます。to_iメソッドは、最初の非数字の文字に到達すると停止します。 ルビーのウェブ開発者は、これを利用して、15が内部IDであり、レコードを検索するための数値的な説明がURLに表示される「15-sammy-shark」のようなURLを作成します。ルビーが15-sammy-sharkをto_iで整数に変換すると、結果は15になり、-sammy-sharkの部分は切り捨てられて破棄されます。その整数は、データベースからレコードを取得するために使用できます。
ここには、あなたを驚かせる可能性のある整数の振る舞いのさらなる例があります。
"abc".to_i
0
この例では、to_iメソッドは0を返します。なぜなら、文字列内のいかなる文字も変換できないからです。これは望ましくない動作を引き起こす可能性があります。ユーザーがプログラムに「abc」と入力し、その値を整数に変換していくつかの数値をその値で割ると、プログラムはゼロで割ることができないためにクラッシュします。
Rubyはこの変換を行う別の方法も提供しています。代わりに、IntegerとFloatのメソッドを使用してデータを変換することができます。
Integer("123")
123
もしIntegerメソッドに変換できない値を渡した場合、Rubyはエラーを発生させます。
Integer("123abc")
ArgumentError: invalid value for Integer(): “123abc”
それからエラーを処理し、ユーザーにメッセージを表示して、より良いデータの提供を求めることができます。このアプローチは少し手間ですが、データが無理に変換されることがないため、データの整合性が向上する可能性があります。
次に、他の種類のデータを文字列に変換する方法を学びます。
データを文字列に変換する
Rubyは他の型を文字列に変換するためのto_sメソッドを提供しています。
25.to_s # "25"
(25.5).to_s # "25.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"
プログラムの出力を作成する際に、データを文字列に変換することがよくあります。
ワークアウトの後、人の毎日のカロリー消費を追跡したいと考えています。この進捗状況をユーザーに表示したいので、文字列と数値を同時に出力することになります。
以下の内容でcalories.rbというファイルを作成してください。 (I need only one option)
user = "Sammy"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories + " calories during this workout."
このプログラムでは、名前とカロリーをハードコーディングしていますが、実際のプログラムでは、データベースやAPIのような別のソースからこれらの値を取得します。
以下のプログラムを実行してください。 (Please run the following program.)
- ruby calories.rb
このプログラムを実行すると、エラーメッセージが表示されます。
… TypeError: no implicit conversion of Integer into String (TypeError)
Rubyは、変数caloriesを出力の残りの部分に追加することは許可しません。なぜなら、caloriesは整数型だからです。クオートで囲むことで文字列に変更することもできません。なぜなら、カロリーデータが制御下にない場所から来ているかもしれないからです。その代わりに、カロリーデータを文字列に変換して出力の残りに結合する必要があります。
出力行を変更し、カロリーを文字列に変換するためにto_sメソッドを使用するように修正してください。
user = "Sammy"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories.to_s + " calories during this workout."
もう一度プログラムを実行すると、期待する出力が得られます。
Congratulations, Sammy! You just burned 100 calories during this workout.
もう一つの選択肢は、Rubyの文字列補間機能を使用することです。この機能は自動的にオブジェクトを文字列に変換してくれます。
プログラムの出力行を文字列補間を使用して書き直してください。
print "Congratulations, #{user}! You just burned #{calories} calories during this workout."
プログラムをもう一度実行してください。文字列内挿の方法を使うと同じ出力が得られることに気付くでしょう。
Rubyのオブジェクトはすべて独自のto_s実装を持っていますが、それが適切な出力であるかどうかはわかりません。求めている出力を得るためには、独自のコードを書くか、他のデータフォーマット方法を調査する必要があります。
Note
次に、文字列を配列に変換する方法を学びます。
文字列を配列に変換する
文字列がある場合は、splitメソッドを使って配列に変換することができます。
"one two three".split
[“one”, “two”, “three”]
splitメソッドに引数として渡すことで、区切り文字として使用したい文字を指定することができます。
「data_import.rb」というプログラムを作成し、カンマで区切られたサメの文字列を含めます。このプログラムはデータを配列に変換し、ソートして、各要素を画面に表示します。
data = "Tiger,Great White,Hammerhead,Whale,Bullhead"
# Convert data to an array by splitting on commas
sharks = data.split(",")
# Sort the sharks alphabetically
sharks = sharks.sort!
# Print out the sharks by iterating through the array
sharks.each{|shark| puts shark }
プログラムを実行する。
- ruby data_import.rb
これが出力です。 (Kore ga shutsuryoku desu.)
Bullhead Great White Hammerhead Tiger Whale
Rubyの配列は強力なデータ構造です。これは、データを処理するためにそれらを使用する方法の一つを示しています。
最後に、文字列とシンボルの変換の方法を学ぶことができるようになりました。
文字列とシンボルの変換
時々、表示するためにシンボルを文字列に変換したくなることがあります。また、ハッシュ内の何かを検索するために文字列をシンボルに変換したいこともあります。
Rubyのto_sメソッドはシンボルにも適用できるので、シンボルを文字列に変換することができます。
:language.to_s
“language”
必要に応じてシンボルを表示し、表示方法を変更したい場合に役立ちます。例えば、次のプログラムはシンボル「:first_name」を「First name」という文字列に変換し、人間が読みやすくなります。
string = :first_name.to_s
# replace underscore with a space and capitalize
string = string.gsub("_"," ").capitalize
文字列をシンボルに変換するには、to_symメソッドを使用します。以下のように書きます。
"first_name".to_sym
:first_name
「First name」という文字列をシンボル「:first_name」に変換するには、すべての文字を小文字にし、スペースをアンダースコアで置き換えます。
string = "First name"
# replace spaces with underscores and convert to lowercase
string = string.gsub(" ","_").downcase
# Convert to symbol
symbol = string.to_sym
これらの変換をしたいと思う状況があります。スクリーン上でシンボルを人にとって分かりやすい形式で表示したい場合や、シンボルをキーとしたハッシュで文字列を調べたい場合などです。
結論
このチュートリアルでは、組み込みメソッドを使って重要なネイティブデータ型を他のデータ型に変換する方法を示しました。数値を文字列に、文字列を配列に、そしてシンボルと文字列の間で変換することができます。
これらのチュートリアルを見て、Rubyのデータ型の探求を続けてみてください。
- How to Work with Strings in Ruby
- How to Work with Arrays in Ruby