!Ubuntu-20.04.1 !ruby-2.7.1p83
これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。
やったこと
- class化
class化
お題
以前作ったhello.rbをclass化しましょう
classの書き方
classは
class hogehoge
def fugafuga
処理内容
end
end
hogehoge.new
というのが基本形。これに従って改良してみる
実践
class Greeter
def initialize
@name = gets_name
puts_hello
end
def puts_hello
puts "Hello #{@name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
end
Greeter.new
「Greeter」クラスの中に「initialize」というメソッドがあり、initializeが入力を受け付ける「gets_name」メソッド、出力を行う「puts_hello」メソッドを順に呼び出すという塩梅。まあ至ってシンプルですね
> ruby hello_class.rb MO_data
> Hello MO_data
initializeって名前にすることで、このメソッドをクラス内に記述した時にオブジェクト作成時に自動的に呼び出されるらしい
発展問題
hello.rbだけで終わると味気ないのでテキストの発展問題に挑戦。お題は「assert_equalをclass化せよ」
require 'colorize'
class assert_equal
def initialize
assert_equal(1,1)
assert_equal(1,2)
assert_not_equal(1,2)
assert_not_equal(1,2)
end
def puts_vals(expected, result)
p ['expected',expected]
p ['result',result]
end
def assert_equal(expected,result)
puts_vals(expected, result)
if expected == result
puts 'succeeded in assert_equal'.magenta
else
puts 'failed in assert_equal'.cyan
end
end
def assert_not_equal(expected,result)
puts_vals(expected, result)
if expected == result
puts 'failed in assert_not_equal'.magenta
else
puts 'succeeded in assert_not_equal'.cyan
end
end
end
assert_equal = assert_equal.new
#+end src
これを実行すると
#+begin_src ruby
codes/assert_equal_class.rb:4: class/module name must be CONSTANT
class assert_equal
ん?CONSTANTでないといけない?ドユコト???
調べるとモジュール名は大文字で始めないといけないらしいので、class名をAssert_equalに変更すると
["expected", 1]
["result", 1]
succeeded in assert_equal
["expected", 1]
["result", 2]
failed in assert_equal
["expected", 1]
["result", 2]
succeeded in assert_not_equal
["expected", 1]
["result", 2]
succeeded in assert_not_equal
いけたいけた
参考記事
- source ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter11.org