Rubyにおけるデータ型の理解
以下の文を日本語で言い換えてください(オプションは一つだけ):
「Introduction」
プログラムを書く際には、データ型を使用してデータを分類します。データ型は、コンピュータにプログラム内のデータをどのように処理するかを伝えます。また、データに対して何ができるのかも決定し、どの操作を行えるかも定めます。
データ型について考える一つの方法は、現実世界で使用するさまざまなデータの種類を考慮することです。例えば、我々は整数(0、1、2、…)、負の整数(…、-1、0、1、…)、そして無理数(π)を使用します。
通常、数学では異なるタイプの数を組み合わせ、何らかの答えを得ることができます。たとえば、5にπを足したい場合があります。
5 + π
以下のように日本語で言い換えます:
私たちは方程式をそのまま使って無理数を考慮した答えとするか、πを少数桁に丸めてから数字を足すかのどちらかを選択することができます。
5 + π = 5 + 3.14 = 8.14
ただし、もし私たちが単語などの別のデータ型で数字を評価しようとすると、事態は少しわかりづらくなります。次の方程式をどのように解決すればいいでしょうか?
sky + 8
これは、即座に解決方法がわかるものではありません。コンピューターも同様で、データが異なる二つの型を持っているために解決できません。「空」というのは単語であり、8は整数です。プログラムを書く際には、値の割り当てや加減乗除などの処理方法に慎重に取り組まなければなりません。
このチュートリアルでは、Rubyに固有の最も重要なデータ型である整数、浮動小数点数、文字列、シンボル、配列、ハッシュについて学びます。これはデータ型の徹底的な調査ではありませんが、プログラムで利用できるオプションに慣れるのに役立ちます。
その後、動的な型について探求します。Rubyプログラムは、変数の中身に基づいてデータ型を判断します。そのため、動的な型付けの仕組みを理解することで、自分自身のプログラムの中でトリッキーな状況を避けることができます。また、変数には任意の値が格納されるため、変数のデータ型を特定する方法も学ぶことになります。
まず、Rubyで整数を扱う方法を見てみましょう。
整数
数学のように、コンピュータプログラミングでは整数は正の数、負の数、または0(…、-1、0、1、…)となる全体の数です。整数は一般的にintとしても知られています。
このようにして整数を印刷することができます。
print -25
-25
変数に整数を格納し、変数を参照して値を表示することもできます。
my_int = -25
print my_int
-25
整数でも数学ができます。たとえば、2つの数の合計を計算して結果を出力することができます。
sum = 116 - 68
print sum
48
大きな数を書く場合、読みやすくするためにカンマを使うことがあります。例えば、「一百万」を表すために1,000,000と書きます。コードではカンマは使えませんが、Rubyではアンダースコア(_)を使って大きな数をより読みやすくすることができます。
試してみてください。 (Tameshite mite kudasai.)
large_number = 1_234_567
print large_number
アンダースコアなしで整数が表示されます。 (Andāsukoa nashi de seishitsu ga hyōji sa remasu.)
1234567
アンダースコアを使えば、プログラム内で大きな数値を表現する際に、より読みやすいコードが書けます。
Ruby言語について学ぶことで、整数との取り扱いに関して多くの機会が増えるでしょう。さて、実数との取り扱い方法を見てみましょう。
浮動小数点数
浮動小数点数またはフロートは実数を表します。実数は有理数または無理数のどちらかです。有理数や無理数のように分数部分を含む数、例えば9.0や-116.42のような数です。言い換えると、Rubyプログラム内でのフロートは小数点を含む数値です。
Rubyでは、整数を出力するように、浮動小数点数も出力することができます。
print 17.3
17.3
変数を宣言し、floatを割り当てることもできます。
my_float = 17.3
print my_float
17.3
そして、整数と同様に、Rubyでは浮動小数点数でも計算ができます。
sum = 564.0 + 365.24
print sum
929.24
Rubyで整数に浮動小数点数を加算すると、浮動小数点数が得られます。
sum = 564 + 365.24
print sum
929.24
ルビーでは、小数点以下がない数(例:138)は整数として扱われ、小数点以下がある数(例:138.0)は浮動小数点数として扱われます。
次に、Rubyでのブール値を見てみましょう。
真偽値データ型 (しんぎちデータがた)
ブール値は、数学の論理分野に関連する真偽値を表すために使用され、それはコンピュータ科学のアルゴリズムに影響を与えます。Rubyでは、このデータ型は真(true)または偽(false)のいずれかの値で表されます。
数学の多くの操作は、真または偽と評価される答えを与えます。
- greater than
- 500 > 100 true
- 1 > 5 false
- less than
- 200 < 400 true
- 4 < 2 false
- equal
- 5 = 5 true
- 500 = 400 false
数字のように、変数には真または偽の値を保存することができます。
result = 5 > 8
それから、print()関数を呼び出してブール値を表示することができます。
print result
5が8よりも大きくないので、次の結果が表示されます。
false
Rubyでプログラムをもっと書くうちに、ブール値の働きや異なる関数や演算がtrueまたはfalseを評価することでプログラムの進行が変わることに慣れていくでしょう。
次に、プログラムでテキストを扱う方法を探ってみましょう。
ストリングス
文字列は、文字、数字、および記号などの1つ以上の文字で構成されるシーケンスです。Rubyでは、文字列は主にシングルクォート(’)またはダブルクォート(”)で囲って作成します。つまり、文字列を作成するには、引用符で文字のシーケンスを囲みます。
"This is a string in double quotes."
小さなプログラム「Hello, World!」は、フレーズHello, World!を構成する文字を文字列として使用する方法を示しています。
print "Hello, World!"
他のデータ型と同様に、文字列を変数に格納することができます。
output = "Hello, World!"
変数を呼び出して、文字列を出力してください。
print output
Hello, World!
数字のように、プログラム内で文字列に対して行うことができる多くの操作があります。これらの操作を使用して、求めている結果を得るために文字列を操作します。文字列はユーザーへの情報の伝達や、ユーザーからプログラムへの情報の伝達に重要です。
時には、データのリストを扱う必要があります。その場合、配列が役立ちます。
配列
配列は1つの変数内に複数の値を保持することができます。つまり、配列内に値のリストを格納し、それらを繰り返し処理することができます。配列内のそれぞれの項目や値は要素と呼ばれます。
配列は、カンマで区切られた角括弧[ ]内の値を指定することによって定義されます。
整数の配列は、以下のように見えます:
[-3, -2, -1, 0, 1, 2, 3]
浮動小数点数の配列は、以下のように見えます。
[3.14, 9.23, 111.11, 312.12, 1.05]
以下は文字列のリストです。
['shark', 'cuttlefish', 'squid', 'mantis shrimp']
他のデータ型と同様に、変数に配列を割り当てることができます。
sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']
変数を出力すると、作成した配列と全く同じ出力が表示されます。
print sea_creatures
['shark', 'cuttlefish', 'squid', 'mantis shrimp']
インデックス番号を使って、0から始まる番号を使って配列内の個々の要素にアクセスします。
puts sea_creatures[0] # shark
puts sea_creatures[2] # squid
最後の値を印刷するには、インデックス-1を使用することができます。Rubyでは、それぞれ最初と最後のエントリを取得するための.firstメソッドと.lastメソッドも提供されています。
puts sea_creatures.first # shark
puts sea_creatures.last # mantis shrimp
Rubyの配列はさまざまな種類のデータを持つことができます。文字列、シンボル、そして他の配列さえも配列に格納することができます。
record = [
:en,
"Sammy",
42,
[
"coral",
"reef"
]
]
Rubyの配列は可変であり、つまり配列に値を追加したり、値を削除したり、配列の中のエントリを変更したりすることができます。
プログラム内で物事にラベルを付ける方法が必要な場合もあります。それがシンボルの役割です。
シンボル
シンボルは、Rubyプログラムでラベルや識別子のような役割を果たす特殊なデータ型です。シンボルは不変であり、変更することはできません。シンボルは値のない変数宣言のように見えます。以下にシンボルの例を示します。
:time_zone
通常、Rubyでは重要なものを特定するためにシンボルを使用し、作業や操作を行うためには文字列を使用します。Rubyプログラム内の各文字列は独自のオブジェクトであり、同一でもメモリ内の異なる場所に格納されます。
ただし、同じシンボルを複数回参照する場合、プログラム全体で同じオブジェクトを参照していることを意味し、同じメモリ位置を参照していることになります。
私たちは、キーと値を関連付けることができるハッシュを見ながら、このコンセプトが実際にどのように機能するかを確認します。
ハッシュ
ハッシュとは、キーと値からなる辞書のようなデータの集まりです。これらのキーと値のペアは、データを保存したりアクセスしたりするための便利な方法を提供します。ユーザーの情報など関連するデータを保持するために、ハッシュはよく使用されます。ハッシュは以下のように定義します。
{"first_name" => "Sammy", "last_name" => "Shark"}
他のデータ型と同様に、ハッシュを変数に割り当てることができます。
user = {"first_name" => "Sammy", "last_name" => "Shark"}
ユーザーハッシュから値を取得するには、値のためのキーを使用します。
print user["first_name"] # "Sammy"
print user["last_name"] # "Shark"
文字列の代わりにシンボルを使って、ハッシュのキーとして使用することができます。 (Mojiiretsu no kawari ni shimbōru o tsukatte, hasshu no kī toshite shiyō suru koto ga dekimasu.)
user = {:first_name => "Sammy", :last_name => "Shark"}
可能な限り、ハッシュキーとしてシンボルを使用することが推奨されています。シンボルの各インスタンスが同じオブジェクトを指し、一方で文字列の各インスタンスは一意のオブジェクトを参照します。シンボルをキーとして使用すると、わずかに性能が向上し、メモリ使用量も少なくなります。
シンボルをキーとして使用する際には、そのシンボルを使って値を取得します。
print user[:first_name] # "Sammy"
print user[:last_name] # "Shark"
ハッシュを定義する際には、わずかに異なる構文も利用することができます。
user = {first_name: "Sammy", last_name: "Shark"}
この構文は、JavaScriptや他の言語で使われている構文に似ています。この構文では、キーをシンボルとして定義するため、”first_name”や”last_name”のような文字列ではなく、:first_nameや:last_nameを使ってエントリーにアクセスします。
いくつかのデータ型を見てきましたので、それらの型との結びつき方をRubyで見てみましょう。
動的型付け
Rubyでは、値を代入する前にデータ型を明示的に宣言する必要はありません。値の代入によってデータ型が決定されます。Rubyは動的型付けを使用しており、静的型付けを使用する言語とは異なり、実行時に型チェックが行われます。Rubyは変数に格納されているデータからデータ型を決定します。これはPythonやJavaScriptのデータ型と類似しています。
以下の例では、変数tは利用可能な任意のデータ型に設定できます。
t = 42 # t is an Integer
t = "Sammy" # t is a String
t = :sammy # t is a Symbol
t = true # t is a boolean (true)
t # t is nil
動的型付け言語を使用すると、既存の変数を異なるデータ型を保持するために再利用することができます。
データを別の形式に変換する際には、これが役立ちます。例えば、ユーザーに数値の入力を求めるための以下のコードがあるかもしれません。
print "Please enter the length of the room: "
length = gets.chop
キーボードから取得するデータは常に文字列ですので、数学的な操作を行うためには長さの変数のデータを数値に変換する必要があります。静的に型付けされた言語では、値を割り当てる前に変数のデータ型を宣言する必要があるため、変換されたデータを保持するために新しい変数が必要になります。しかし、Rubyでは動的に型付けされているため、必要であれば長さの変数を再利用することができます。
# Convert the amount to a Float.
length = length.to_f
to_fメソッドは、文字列を浮動小数点数に変換します。Rubyにはまた、文字列を整数に変換するためのto_iメソッドもあり、ほとんどのオブジェクトはto_sメソッドを使って文字列に変換することができます。
42.to_s # "42"
(42.5).to_s # "42.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"
Rubyは動的に型付けされていますが、異なるタイプのデータに対して操作を行うことはできず、同じタイプに変換しなければなりません。例えば、このコードはエラーが発生します。
print 5 + "5"
TypeError: String can’t be coerced into Integer
このコードでは:
print "5" + 5
TypeError: no implicit conversion of Integer into String
もし10を得るために数字を足したい場合は、文字列を整数に変換してください。もし”55″を得るためにそれらを結合したい場合は、整数を文字列に変換してください。
動的型付けは柔軟性を提供しますが、そのデメリットのひとつは、変数には利用可能な任意の型が含まれる可能性があるため、常にどの種類のデータを扱っているか確認できないことです。Rubyにはデータの型を特定する方法が提供されています。
データ型の識別
Rubyではほぼすべてのものがオブジェクトです。整数、浮動小数点数、配列、シンボル、ハッシュはすべてRubyオブジェクトであり、それぞれがクラスというメソッドを持っており、自身のタイプを教えてくれます。真偽値のtrueとfalse、および値nilもオブジェクトです。自分で試してみてください。
42.class # Integer
(42.2).class # Float
["Sammy", "Shark"].class # Array
true.class # TrueClass
nil.class # NilClass
さらに、kind_of? メソッドを使用して、特定のデータ型を確認することもできます。このようにして使用します。
42.kind_of?(Integer) # true
変数があり、その型を特定したい場合、これは特に役立ちます。
# somewhere in the code...
sharks = ["Hammerhead", "Tiger", "Great White"]
...
# somewhere else...
sharks.kind_of?(Hash) # false
sharks.kind_of?(Array) # true
あなたは外部のソースから来たデータが正しいことを確認するために、これを使うこともできます。
if data.kind_of? String
data = data.to_f
end
Rubyはis_a?メソッドも提供しており、kind_of?と同じことをしますが、一部の開発者にとっては少し読みやすいかもしれません。
if data.is_a? String
data = data.to_f
end
クラス、kind_of?、is_a?を使うことで、適切なデータ型を扱っていることを確認することができます。Rubyを学ぶにつれて、データの型を明示的にチェックする必要のない他のデータ処理方法も見つけることができます。
結論
あなたのRubyプログラムで、さまざまなデータ型を使用します。Rubyプログラムで利用可能な主要なデータ型について、今はより良い理解を持っています。
Rubyのデータ型を探求するために、これらのチュートリアルをご覧ください。
- How to Work with Strings in Ruby
- How to Work with Arrays in Ruby
- How to Convert Data Types in Ruby