Rubyでデータ型を変換する方法
序章
作成する各プログラムには複数のデータ型が含まれますが、通常は同じデータ型内で操作を実行することに注意してください。 つまり、数字に対して数学を実行したり、文字列を結合したりします。
キーボード、APIレスポンス、データベースなどの外部ソースからデータが取得される場合があります。データを操作するには、データを変換する必要があります。 Rubyには、あるデータ型から別のデータ型に値を変換するためのいくつかの方法が用意されています。 このチュートリアルでは、文字列を数値に、オブジェクトを文字列に、文字列を配列に変換し、文字列と記号の間で変換します。
文字列を数値に変換する
Rubyには、文字列を数値に変換するためのto_i
およびto_f
メソッドが用意されています。 to_i
は文字列を整数に変換し、to_f
は文字列をfloatに変換します。
"5".to_i # 5
"55.5".to_i # 55
"55.5".to_f # 55.5
2つの数値の入力を求め、合計を表示する小さなプログラムを作成して、これを示しましょう。 次のコードを使用して、adder.rb
という新しいRubyプログラムを作成します。
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
OutputWhat 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
でプログラムを再実行してください。 今回は、次の出力が表示されます。
OutputWhat 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
この例では、文字列"123abc"
を整数に変換すると、整数123
になります。 to_i
メソッドは、最初の非数字文字に達すると停止します。 Ruby Web開発者は、15-sammy-shark
のようなURLを作成することでこれを悪用します。ここで、15
はレコードを検索するための内部IDですが、sammy-shark
はURLにテキストによる説明を提供します。 Rubyが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")
OutputArgumentError: invalid value for Integer(): "123abc"
次に、エラーを処理してユーザーにメッセージを提供し、より適切なデータを提供するように依頼できます。 このアプローチはあまり便利ではありませんが、データが強制されないため、データの整合性が向上する可能性があります。
次に、他のタイプのデータをsttingsに変換する方法を見てみましょう。
データを文字列に変換する
Rubyには、他の型を文字列に変換するためのto_s
メソッドが用意されています。
25.to_s # "25"
(25.5).to_s # "25.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"
プログラム出力を作成するときに、データを文字列に変換することがよくあります。
トレーニング後の人の毎日のカロリー消費量を追跡したいとします。 この進行状況をユーザーに表示したいと思います。つまり、文字列と数値を同時に出力します。 次の内容でファイルcalories.rb
を作成します。
user = "Sammy"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories + " calories during this workout."
このプログラムでは名前とカロリーをハードコーディングしていますが、実際のプログラムでは、これらの値を別のソースから取得します。
ruby calories.rb
でプログラムを実行してください。
このプログラムを実行すると、次のエラーが表示されます。
OutputTypeError: no implicit conversion of Integer into String
Rubyでは、calories
変数は整数であるため、残りの出力に追加することはできません。 繰り返しになりますが、カロリーデータは制御できない場所から取得されている可能性があるため、引用符で囲んで文字列に変更することはできません。 代わりに、カロリーデータを文字列に変換して、残りの出力に結合できるようにする必要があります。
to_s
メソッドを使用して、calories
を文字列に変換するように出力行を変更します。
user = "Sammy"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories.to_s + " calories during this workout."
プログラムを再度実行すると、期待する出力が表示されます。
OutputCongratulations, Sammy! You just burned 100 calories during this workout.
Rubyの文字列補間機能は、オブジェクトを自動的に文字列に変換します。 これは、Rubyプログラムで出力を作成するための推奨される方法です。
代わりに文字列補間を使用するようにプログラムの出力行を書き直してください。
print "Congratulations, #{user}! You just burned #{calories} calories during this workout."
プログラムを再度実行すると、同じ出力が表示されます。
Rubyオブジェクトはすべて、独自のto_s
実装を提供します。これは、出力に適している場合とそうでない場合があります。 探している出力を取得するために独自のコードを記述したり、データをフォーマットするための他の方法を調査したりする必要がある場合があります。
注:Rubyオブジェクトは、デバッグに最適なinspect
メソッドも提供します。 inspect
メソッドは、to_s
と同じように機能します。 多くの場合、オブジェクトとそのデータの文字列表現を返します。 本番アプリではinspect
を使用しませんが、コードの記述中に変数を確認する場合は、puts
で使用できます。
文字列を配列に変換する方法を見てみましょう。
文字列を配列に変換する
文字列がある場合は、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 alpabetically
sharks = sharks.sort!
# Print out the sharks
sharks.each{|shark| puts shark }
ruby data_import.rb
を使用してプログラムを実行すると、次の出力が表示されます。
OutputBullhead
Great White
Hammerhead
Tiger
Whale
Rubyの配列は強力なデータ構造です。 これは、それらを使用してデータを処理する1つの方法を示しています。
最後に、文字列と記号の間で変換する方法を見てみましょう。
文字列と記号の間の変換
シンボルを文字列に変換して表示できるようにしたい場合もあれば、文字列をシンボルに変換してハッシュで何かを検索できるようにしたい場合もあります。
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のデータ型の調査を続けてください。