8
0

More than 3 years have passed since last update.

hello_class

Posted at

目標

Rubyでのclass化(隠蔽,継承)を理解する.

解説

隠蔽

まずは,gets_nameで入力をとってきて,puts_nameでHello ~~と表示するプログラムを使っていきます.

def puts_hello name
  puts "Hello #{name}."
end
def gets_name
  name = ARGV[0] || 'world'
  return name
end

name = gets_name
puts_hello name

入力がない場合はHello worldと表示します.クラス化するメリットとしてはmain loopを隠すことが出来ます.これが隠蔽です.

class Greeter
  def initialize
    name = gets_name
    puts_hello name
  end
  def puts_hello name 
    puts "Hello #{name}."
  end

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

Greeter.new

Greeterというクラスを作ることでmainの部分を隠蔽できました.これを動かすと

>ruby hello_class.rb Taro
Hello Taro.

無事出力されました.

@name

先ほどのnameという変数を@nameとすることでGreeterというクラスの中で参照することが出来ます.それらを反映させると

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

先ほどのコードとの違いとして,puts_helloを定義する際に,引数のnameがないという点です.

継承

次はmethodで定義したものをclassに継承していきます.次のコードの中ではinherited classが継承の部分を表しています.

require 'colorize'

#method
def hello name
  "Hello #{name}"
end
name =ARGV[0]
puts hello(name).green

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

greeter = Greeter.new(ARGV[0])
puts greeter.hello.red


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

puts ARGV[0].hello.blue

実行してみると以下の結果になります.

Hello Taro
Hello Taro.
Hello Taro.

そして,コードの中のextend classについてはclassに上書き(over ride)したものになっています,

参考にしたサイト

この記事を書くために以下のサイトを参考にしました.チャート式ruby-VI(hello class)


  • source ~/grad_members_20f/members/Takahiro-Nishikawa/ruby_hello_class.org
8
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
8
0