前提
C#のList<独自モデル>,Dictionary,あたりを理解している人がRubyを勉強し始めて、
データをどう取りまわすのがいいかをまとめたメモです。
List、配列はArray
ary = [1,2,3]
ary = ["Shinji","Ray","Asuka"]
ary = Array.new(3) #要素数を指定して宣言
ary = Array.new(3, 0) #二つ目の引数を入れると、その値で初期化
#2次元配列のときは下記のようにmapを使うこと (じゃないと最初の行のポインタが他の行に展開されちゃう)
ary = Array.new(3).map{Array.new(3,0)}
#Rubyは一つ一つがオブジェクトなので、配列の要素に長さの違う配列を入れたりもできる
ary = [9, 2, 3, [4, 5], [6, [7, 8]]]
#既存のオブジェクトに要素を追加するときはpush
animals = ["dog", "cat", "mouse"]
animals.push("pig")
#削除はdelete
fruits = ["apple", "orange", "banana", "kiwi", "banana"]
fruits.delete("banana")
#C#と違って、イテレートしている自分自身の要素も削除できる
fruits = ["apple", "orange", "banana", "kiwi", "banana"]
fruits.each{|fruit|
if fruit == "orange"
fruits.delete(fruit) #これはエラーにならない
end
}
p fruits
Dictionaryに相当するのはHash。 なんだけど、ちょっと注意が必要
RubyのHashはC#のDictionaryと違って書き方の自由度が高いので理解に迷うところもあった
#一番シンプルな形 (key-value) を使うときは、そのまま入れてけばOK
scores = {} # 空のハッシュを作成
scores["Shinji"] = 80 # キー"Shinji"、値80のペアを追加
scores["Ray"] = 70
scores["Asuka"] = 60
# このように書いてもよい
scores = {"Shinji" => 80, "Ray" => 70, "Asuka" => 60 }
上記と異なり、複数のハッシュを持ったHashオブジェクトを一つのレコードとみなし、それら複数のレコードをもった配列やHashオブジェクトを扱う場合
#配列
students = [] #配列を宣言
students[0] = {name: "Taro", age: 16, bloodType: "A"}
students[1] = {name: "Jiro", age: 17, bloodType: "B"}
students[2] = {name: "Maro", age: 18, bloodType: "O", weight: "55kg"} # レコードの内容が異なってもOKなとこがHashは便利
students.each { |student|
p student[:name]
p student[:weight]
}
#Hashオブジェクト
students = {} #空のハッシュを宣言
students["A"] = {name: "Taro", age: 16, bloodType: "A"}
students["B"] = {name: "Jiro", age: 17, bloodType: "B"}
students["C"] = {name: "Maro", age: 18, bloodType: "O", weight: "55kg"}
students.each { |key,student| #keyを使わない場合でも、宣言しとかないとエラーになる
p key
p student[:name]
p student[:weight]
}
レコードの内容が動的に変化するような場合はハッシュを使ったほうが楽。
定義したフィールド以外に変更したくない場合 (C#に近いやり方)
c#だと独自のクラスを作って、List<独自クラス>とかDictionaryみたいな
使いかたをよくやります。
Rubyではクラスを使って定義する方法と、structを使う方法があります。
まずは、structを使ったやり方がこちら
student = Struct.new("Student", :name, :age, :bloodType)
students = []
students.push(student.new("Taro", 16, "A"))
students.push(student.new("Taro", 17, "A"))
students.each{|student| p student.name} #こんな感じでc#のメンバ変数っぽく書ける
ただし、上記のやり方だと当然ながらメソッドは 持たせられない。 持たせられます!! このページの下部、scivolaさんのコメントをご参考ください。
次に、クラスを使う方法はこちら
class Student
def initialize(n, a, bt) #コンストラクタはinitializeという名前で統一されている
@name = n
@age = a
@bloodType = bt
end
attr_accessor :name, :age, :bloodType #attr_accessorはいわゆるゲッター セッター
end
students = []
students.push(Student.new("Taro",16,"A"))
students.push(Student.new("Jiro",17,"B"))
students.each{|student|
p student.age #get
student.age += 1 #set
}
puts "--------"
students.each{|student|
p student.age #get
}
以上です。
Rubyは自分の実力が試される言語だなと日々感じながら勉強中。