LoginSignup
10
0

More than 3 years have passed since last update.

Class化について

Last updated at Posted at 2020-12-07

Document Links

Class化

復習

前回の記事でClass化について少し触れたが,わかりやすいように復習がてら記述

オブジェクト指向において,鍵となる考え方が,

  • 隠蔽(capsulation)
  • 継承(inheritance)
  • 多態(polymorphism)

の3つです.

Methodはある種の隠蔽だけど,更に言語システムとして徹底したのが, Class であるとのこと.

前回,その例として

def puts_hello name
  puts "Hello #{name}."
end

def gets_name
  name = ARGV[0] || 'world'
  return name
end

name = gets_name
puts_hello name

実行結果

$ ruby hello.rb
Hello World.
$ ruby hello.rb Name
Hello Name.

mainでloopがある.

こいつを消したいので,修正すると(前回から少し修正しています)

greeter_class.rb
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.capitalize #".capitalize"で先頭が大文字になる
  end
end

Greeter.new

実行結果は同じになる.

  • Greeter.new
  • class Greeter
  • initialize method
  • @name

なんかが鍵となる.

というところまでしました.

MethodとClassについて

methodとclassを比べるとobject指向の書き方の流儀の違いが実感できるらしい.

  • methodでは,verb(subject,object)
  • object指向では,subject.verb(object)

とな.

よくわからんが,とりあえず書いてみる.(ついでに出力の色分けもした)

hg_class.rb
require 'colorize'

# method
def hello(name)
  "Hello #{name}."
end

# class
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.capitalize
  end
end

# method call
name = ARGV[0]
puts hello(name).green

# class call
Greeter.new

うーん,まだよくわからん.

資料を読んで,更に加筆,修正していく.

hg_class2.rb
require 'colorize'

# method
def hello(name)
  "Hello #{name}."
end

# inherited class
class Greeter < String
  def hello
    "Hello #{self}."
  end
end

# extend class
class String
  def hello
    "Hello #{self}."
  end
end

# method call
name = ARGV[0]
puts hello(name).green

# inherited class call
greeter = Greeter.new(ARGV[0])
puts greeter.hello.red

# extend class call, override
puts ARGV[0].hello.blue

上から,method,継承class,classのoverrideで書いている.

Greeter classはString classから継承することで,hello methodを扱うことが出来ている.(という認識,合ってるのか?)

まだまだ勉強が必要ですな...

attr_accessor

rubyのclassのidiomでよくあるのが,

hg_class2.rb
require 'colorize'

# method
def hello(name)
  "Hello #{name}."
end

# inherited class
class Greeter < String
  def hello
    "Hello #{self}."
  end
end

# extend class
class String
  def hello
    "Hello #{self}."
  end
end

# method call
name = ARGV[0]
puts hello(name).green

# inherited class call
greeter = Greeter.new(ARGV[0])
puts greeter.hello.red

# extend class call, override
puts ARGV[0].hello.blue

のようなものらしい.

実行結果

$ ruby hg_class_accessor.rb masa
Hello World.
Hello Masa.

どのように動作しているか,詳しくは講義資料に書いてくれています.

締め

今回はClassについて学んだ.

次回,Thor & Rubocop


  • source ~/school/multi/my_ruby/grad_members_20f/members/evendemiaire/post/class.org
10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0