Ruby入門3、オブジェクト指向構文まとめ~これからにRubyに乗り換えする人へ~

| コメント(0) | トラックバック(0)

rubyにおけるエレガント記述、オブジェクト指向の書き方まとめ

ruby
#メソッドの呼び出し方
"aabbcde".count("a-c","^b")
"aabbcde".count "a-c","^b"

#文字の次 succ
str = "a"
str.cucc   # => "b"

# メソッド作成
def test(str)
  a = "Hello " + str
  return a
end
p  test "World"

# メソッド作成 引数1
# rubyは関数がないので、その代替として扱える
def arg(a,b=1,c=2,d=3,e)
  [a,b,c,d,e]
end
arg 4,5       #=> [4, 1, 2, 3, 5]
arg 4,5,6     #=> [4, 5, 2, 3, 6]
arg 4,5,6,7   #=> [4, 5, 6, 3, 7]
arg 4,5,6,7,8 #=> [4, 5, 6, 7, 8]

# メソッド作成 引数2
def arg(a,*b)
  [a,b]
end
arg 1      #=> [1, []]
arg 1,2    #=> [1, [2]]
arg 1,2,3  #=> [1, [2, 3]]

# class作成
obj = Object.new
def obj.one
  p 1
end
obj.one

# class作成2
class Foo
  def self.one  # self 自分自信のclass
    p 1
  end
end
Foo.one

#class 継承
class Foo
end

class Bar < Foo
end

Bar.superclass

#classの使用例
class Foo
  @@i = 1
  #self自信のclass
  def self.a ()
    @@i += 1
  end

  def b ()
    @@i +=2
  end
end

Foo.a  #selfを付けることで関数として呼出OK
Foo.b  #NoMethodError
Foo.i  #NoMethodError

foo = Foo.new
foo.a  #NoMethodError
foo.b  #動作
foo.i  #NoMethodError

#class 処理フロー
class Example
  def initialize(arg)  #インスタンス作成に呼出
    @ivar = arg        #外からは見れない
  end
end
e = Example.new 2
e.ivar rescue $!       #NoMethodError

#class InstanceMethodeExample
class InstanceMethodeExample
  def double(x)
    x*2
  end
  def quadruple(x)
    double(double(x))
  end
  def show_self
    self
  end
end

obj = InstanceMethodeExample.new
obj.double(2)    #=> 4
obj.quadruple(2) #=> 8
obj.show_self    #=> InstanceMethodeExample

#open class
# 既存のクラスに対しmethod付加が可能
class Array
  def randomize
    sort_by { rand }
  end
end
[1,2,3,4,5].randomize #=>[1, 2, 4, 3, 5]]

#class継承の親class method実行
class Foo
  def fuga(arg)
    "++#{arg}++"
  end
end

class Bar < Foo
  def fuga(arg)
    arg                         # 3
    super                       # ++3++
    super(10)                   # ++10++
    arg += arg                  # 6
    super                       # ++6++
  end
end

Bar.new.fuga(3)

#module 定義
# Mix-inや名前空間分離のため利用。
# 多重継承の場合複雑化になる、単体継承は力不足のジレンマ
# それそを解消するのがMix-in
#
# インスタンスを作成できない(抽象クラス)
# moduleはmoduleからのみ継承
# 1つのclassのみから継承する
# 複数のmoduleから継承
module MixInParent
  def perent()
    :parent
  end
end

module MixInChild
  include MixInParent
  def child() :child end

end

class Example
  include MixInChild
end

obj = Example.new
obj.child
obj.parent

#特異method 特異class
# objectの専属method
str = "singleton"
str.upcase                      # -> "SINGLETON"
class << str
  def smeth()
    "Other string don't have this method ."
  end
  def upcase
    super + "!!"
  end
end

str.singleton_methods     # => [:smeth, :upcase]  特異メソッドの一覧
str.smeth                 # => "Other string don't have this method ."
str.upcase                # => "SINGLETON!!"

str2 = "singleton"
str2.equal? str                 # => false
str2.upcase                     #
str.smeth rescue $!

str.replace "altered"           # 内容書き換え
str.upcase                      # => "ALTERED!!"□□□書換てもmethodは有効


関連記事

トラックバック(0)

トラックバックURL: http://mukaer.com/cgi-bin/mt/mt-tb.cgi/39

コメントする

PR

PR





検索

Loading

メニュー

twitter