気ままに趣味旅行

面白いコト「拡がる/拡げる」

Rubyの基礎5

f:id:hiroakies4463:20190110194257j:plain
どうもhiroakiです。

 

今回も引き続き、Rubyの基礎について紹介します。Webサイトを作ろうとしている人にとってRubyは必須の言語です。自分はとにかくウェブサイトを作ってみたい人間ですので、これをなんとか習得したいと思っています。これからまとめる内容を、みなさんもぜひ参考にしてみてください。

 

▼前回までの記事はこちらです。

hiroakies.hatenablog.com

 

lesson12

二次元配列

二次元配列って言葉が難しいですね(笑)次のコードを見てみましょう。

  1. teams = [["公務員", "郵便局員", ], ["経営者", "店員", "アルバイト"], ["常連客", "一般客", "魔王"]]
  2. teams[0][1] = "団体職員"  #値の更新
  3. p teams.length # 要素数 3
  4. p teams[0].length # 2
  5. teams.push("通行人")  #値の追加
  6. teams.push(["通行人","犬"])  #値の追加、配列
  7. teams[0].push("銀行員")
  8. teams.delete_at(1)  #値の削除
  9. teams[0].delete_at(1)
  10. p teams

値はなんでもいいです。詳細はコメント欄#を参照してください。

 

コード例

まずは、一次元配列の場合を思い出してください。

  1. list =
  2. while line = gets
  3. list=line.chomp.split(',')
  4. end
  5. p list

二次元配列は次のようにします。

  1. list =
  2. while line = gets
  3.   line.chomp!
  4.   list.push(line.split(","))
  5. end
  6. p list

コンマ,区切りの一行文字列をgetsで受け取り、lineに入れます。 こうすることで二次元配列をつくれます。

また、下記のlesson10コード例1との違いも比べてみてください。

hiroakies.hatenablog.com

 

新しい配列を作る

mapメソッド

mapメソッドを使えば、新しく配列をつくることができます。

  1. numbers = [12,22,33]
  2. results2 = numbers.map do |item|
  3.   item * 10
  4. end
  5. p results2

2.のようにすると、配列から要素をひとつずつ取り出してendまでの処理をして別の変数に代入することができます。

 

Arrayクラスで配列を作る

  1. numbers = Array.new(10)
  2. p numbers
  3. numbers2 = Array.new(4,Array.new(3, 1))
  4. numbers2[0][1] = 2
  5. p numbers2
  6. numbers3 = Array.new(4).map{Array.new(3, 1)}
  7. numbers3[0][1] = 2
  8. p numbers3

1.はArray.new(要素数,初期値)で作成できます。

これを二次元配列にする場合は、3.のようにします。しかし、このArrayは初期値を要素数複製したものなので、4.のようにすると、4つの要素の[1]番目の値が更新されてしまいます。ここが注意です。

なので、6.のようにすると良いです。Array.newで作った配列の4要素をmapで1つずつ取り出して、その中に、3つ要素のある配列を作っています。7.で値の更新をして8.で出力すると、numbers3[0][1] の要素だけが変わったのが分かりますね。

クラスについては、次のlessonで説明します。

 

補足

 インデックス値を使いたい場合

  1. team = ["銀行員", "経営者", "フリー"]
  2. team.each_with_index do |person, i|
  3. puts "#{i}:#{person}はコーヒーをたのみました。"
  4. end

 

3次元配列

3次元配列は2次元配列と同じです。

  1. numbers3 = [
  2. [[1,2],[3,4]],
  3. [[5,6],[7,8]]
  4. ]
  5. p numbers3[0]
  6. p numbers3[0][1]
  7. p numbers3[0][1][1]

1.のように[]を3重にすると作れます。8.のようにして値を指定します。

 

lesson13

クラス

次はクラスについてです。前回までにメソッドを紹介してきましたが、メソッドの目的は「処理をひとかたまりにするため」でしたよね。

クラスは「変数やメソッドをひとかたまりにしたもの」です。そして、それを呼び出して再利用したりするんです。これがオブジェクト指向言語の特徴です。

プログラミングでは「クラス=設計図」とよく例えられます。メソッドが呼び出されて初めて実行されるように、クラスも使われて初めて実行されます。クラスによって作られた「もの」をオブジェクトとか、インスタンスと言います。

 

クラスを作成する

  1. class Player # クラス定義
  2.   def walk()
  3.     puts "hiroakiは歩く。"
  4.   end
  5.   def meet(person)
  6.     puts "hiroakiは#{person}に出会った"
  7.   end
  8. end
  9. player1 = Player.new() # オブジェクトを生成
  10. player1.walk() # オブジェクトのメソッドを呼び出す
  11. player1.meet("トム")

クラスは「class クラス名」~「end」で定義できます。クラス名は必ず大文字で始めることに注意しましょう。この中に処理をまとめることができます。

クラス(設計図)を元に、インスタンス(実物)を生成するには、「クラス名.new」とします。「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入できます。

クラスの中で定義したメソッド(インスタンスメソッド)は、「インスタンス.メソッド名」のように、インスタンスに対して使うようにして呼び出します。

 
attr_accessorについて
  1. class Menu
  2.     attr_accessor :name
  3.     attr_accessor :price
  4.     def show
  5.         puts "これはメニューです"
  6.     end
  7. end
  8. menu1 = Menu.new
  9. p menu1.name
  10. menu1.show
オブジェクトの外から読み書きできる「インスタンス変数」を作るには、「attr_accessor シンボル」のようにします。こうすることで、Menuクラスのインスタンス(実物)にnameという情報を持たせることができます。

読み出しのみ「attr_reader シンボル」

書き込みのみ「attr_writer シンボル」

 

self変数

  1. class Menu
  2.     atter_accessor :name
  3.     atter_accessor :price
  4.     def show_name
  5.         puts "これは#{self.name}です"
  6.     end
  7. end
  8. menu1 = Menu.new
  9. menu1.name = "すし"
  10. menu1.show_name 

インスタンスメソッドの中では、「self.変数名」とすることで、インスタンス変数を扱うことができます。インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されます。

 

 

今回はひとまずこれくらいでいいでしょう。

次回以降も同様にまとめていきます。自分も学びながらですので、間違いや意見、質問等あればコメントください。よろしくお願いします。

ではでは。 

 

もっと詳しく知りたい方は以下もご参考に。

qiita.com

tech-camp.in