diff --git a/cherry.txt b/cherry.txt index 4bc978c..6eca28e 100644 --- a/cherry.txt +++ b/cherry.txt @@ -179,6 +179,31 @@ Ragexp.last_match : 正規表現のマッチやキャプチャを取得できる match? : マッチするとtrue、しなければfalseを返すのは他と同じだが内容を書き換えないので高速に処理できる 231ページまで +## 3/24 +クラスの利点:堅牢なプログラムを作ることができる +↑nilではなくちゃんとエラーが返ってきたり、内容の変更を防止できる +クラス:すべてのオブジェクトが属するもの。クラスが同じであれば使えるメソッドも同じ。 +オブジェクト、インスタンス、レシーバ:クラスをもとにして作られたデータの塊がオブジェクト、場合によってはインスタンスと呼ぶこともある。メソッドとの関係を説明する場合においてはレシーバと呼ぶこともある。 +↑「2行目でUserオブジェクトのfirst_nameメソッドを呼び出しています。ここでのfirst_nameメソッドのレシーバはuserです」というように使う。 +↑つまり「メソッドを呼び出された側」というニュアンスを強調する時にレシーバと呼ぶ +メソッド:オブジェクトが持つ動作をメソッドと呼ぶ。他のプログラミング言語では関数やサブルーチンと呼ばれている。 +属性(プロパティ、アトリビュート):オブジェクトから取得あmたは設定できる値のことを属性と呼ぶ。 +クラス名は必ず大文字で始める +User.new : オブジェクトを作成する。この際にinitializeメソッドが呼ばれる。他の言語ではコンストラクタと呼ばれている。 +インスタンスメソッドの定義:クラス構文の内部でメソッドを定義するとインスタンスメソッドになる。Class.methodの形式で呼び出せるようになる +インスタンス変数:同じオブジェクトの内部で共有される変数。頭に@がつく。 +ローカル変数のスコープ:その変数が宣言された位置から自身が宣言されたメソッドまたはブロックの終わりまで。ローカル変数は参照する前に必ず値を代入して作成しなければならない。 +↑インスタンス変数は作成する前にいきなり参照してもエラーにならずnilが返る +インスタンス変数はクラスの外部から参照できず、したい場合は参照用のメソッドを作る必要がある +イコールで終わるメソッド名:name=(value)のような形式でインスタンス変数を外部から変更するメソッドを作る時などに使われる。これをセッターメソッドと呼ぶ。アクセサメソッドとも呼ぶ +単純にインスタンス変数の内容を外部から読み書きするぶんにはattr_accessorが使える:これ「ゼロわか」でやったな。フォーマッタにかけるとこれに書き換わる。読み取り専用のattr_readerメソッド、書き込み専用のattr_writerなどもある。 +クラスメソッドの定義:頭にself.のついたメソッドはクラスメソッドになる。そのクラスに関連しているがインスタンスに含まれるデータは使わないメソッドを定義する場合に使われる。class << self 処理 endとしてもよい +メソッドの表記:インスタンスメソッドを表す場合にクラス名#メソッド名と書くことがある。クラスメソッドの場合はクラス名.メソッド名、またはクラス名::メソッド名と書く +255ページから + + + + diff --git a/main.rb b/main.rb index e755315..1538a5a 100644 --- a/main.rb +++ b/main.rb @@ -1,5 +1,18 @@ -def convert_hash_syntax(old_syntax) - old_syntax.gsub(/:(\w+) *=> */) do - "#{$1}: " +class Gate + def initialize(name) + @name = name + end + + def enter(ticket) + end + + def exit(ticket) + true + end +end + +class Ticket + def initialize(fare) + @fare = fare end end diff --git a/main_test.rb b/main_test.rb index 197d000..879c050 100644 --- a/main_test.rb +++ b/main_test.rb @@ -1,22 +1,22 @@ require 'minitest/autorun' require_relative 'main' -class ConvertHashSyntaxTest < Minitest::Test - def test_convert_hash_syntax - old_syntax = <<~TEXT - { - :name => 'Alice', - :age => 20, - :gender => :famle - } - TEXT - expected = <<~TEXT - { - name: 'Alice', - age: 20, - gender: :famle - } - TEXT - assert_equal expected, convert_hash_syntax(old_syntax) +class GateTest < Minitest::Test + def test_gate + umeda = Gate.new(:umeda) + juso = Gate.new(:juso) + + ticket = Ticket.new(160) + umeda.enter(ticket) + assert juso.exit(ticket) + end + + def test_umeda_to_mikuni_when_fare_is_not_enough + umeda = Gate.new(:umeda) + mikuni = Gate.new(:mikuni) + + ticket = Ticket.new(160) + umeda.enter(ticket) + refute mikuni.exit(ticket) end end