Rubyでデータ型を変換する方法

前書き

作成する各プログラムには複数のhttps://www.digitalocean.com/community/tutorials/understanding-data-types-in-ruby[data types]が含まれますが、通常は操作を実行することに留意することが重要です同じデータ型内。 つまり、数値に対して数学を実行したり、文字列を結合したりします。

キーボード、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プログラムを作成します。

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
OutputWhat is the first number?
What is the second number?

このプログラムは、「+ 5+」と「5」の合計が「55」であることを示しています。 あなたはそれが正しくないことを知っていますが、コンピューターは技術的に間違っていません。 私たちのプログラムは2つの数字を要求しましたが、キーボードでそれらを入力しました。 number 5は送信しませんでした。 character `" 5 "`を送信しました。 つまり、プログラムは両方の入力を文字列として認識し、文字列 `" 5 "`と `" 5 "`を一緒に追加すると、新しい文字列 `" 55 "`を取得します。 。

これを回避するには、両方の文字列を数値に変換する必要があります。 `+ to_f +`メソッドを使用して、両方の数値を浮動小数点数に変換するようにプログラムを変更します。

adder.rb

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?
What is the second number?

「5」と「5」をもう一度入力すると、今回は「10.0」が表示されます。

「+ to_i 」および「 to_f +」メソッドには、文字列が数値でない場合に興味深い動作があります。 次の例を見てください。

"123-abc".to_i  # 123

この例では、文字列 `" 123abc "`を整数に変換すると、整数 `+ 123 `になります。 ` to_i `メソッドは、最初の非数値文字に到達すると停止します。 Ruby Web開発者はこれを利用して、「 115-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"

その後、エラーを処理し、ユーザーにメッセージを提供して、より良いデータの提供を求めることができます。 このアプローチはあまり便利ではありませんが、データが強制されないため、データの整合性が向上する可能性があります。

次に、他の種類のデータをスティングに変換する方法を見てみましょう。

データを文字列に変換する

Rubyには、他の型を文字列に変換するための `+ to_s +`メソッドが用意されています。

25.to_s                    # "25"
(25.5).to_s                # "25.5"
["Sammy", "Shark"].to_s    # "[\"Sammy\", \"Shark\"]"

多くの場合、プログラム出力を作成するときにデータを文字列に変換します。

運動後の人の毎日のカロリー消費量を追跡したいとしましょう。 この進捗状況をユーザーに表示したいので、文字列と数値を同時に出力します。 次の内容のファイル `+ calories.rb +`を作成します。

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 +`を文字列に変換します。

calories.rb

user = "Sammy"
calories = 100

print "Congratulations, " + user + "! You just burned " + calories + " calories during this workout."

プログラムを再度実行すると、期待する出力が表示されます。

OutputCongratulations, Sammy! You just burned 100 calories during this workout.

Rubyのhttps://www.digitalocean.com/community/tutorials/how-to-work-with-strings-in-ruby#using-string-interpolation [文字列補間]機能は、オブジェクトを自動的に文字列に変換します。 これは、Rubyプログラムで出力を作成するための推奨される方法です。

プログラムの出力行を書き換えて、代わりに文字列補間を使用します。

calories.rb

print "Congratulations, #{user}! You just burned #{calories} calories during this workout."

プログラムを再度実行すると、同じ出力が表示されます。

Rubyオブジェクトはすべて、独自の `+ to_s +`実装を提供します。これは、出力に適している場合とそうでない場合があります。 探している出力を取得するために独自のコードを記述するか、データをフォーマットする他の方法を調査する必要があります。

文字列を配列に変換する方法を見てみましょう。

文字列を配列に変換する

文字列がある場合は、 `+ 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のデータ型の調査を続けてください。