名前はまだない。

プログラミングのことや趣味のことに関して綴ります。

Rubyの基本シンタックスまとめてみた~Part 2~

Rubyの基本シンタックスまとめてみた、続きです。 前回の記事はこちらを御覧ください。

クラス

クラス定義
class Foo
end
継承
class Bar < Foo
end
クラス定義の追加
class Foo < Array
  def hoge
  end
end

class Foo
  def piyo
  end
end

class Foo < Fixnum
end
#=> superclass mismatch for class Foo (TypeError)
内部クラス
class Foo
  class Bar
  end
end
class Foo
end

class Foo::Bar
end
特異クラス
class Foo
  class << self
  end
end

変数

インスタンス変数
class Foo
  def hoge
    @instance_var = 'This is instance variable'
  end

  def self.hoge_hoge
    @instance_var = 'This is instance variable'
  end
end

foo = Foo.new
p foo.hoge #=> This is instance variable
p foo.hoge_hoge #=> nil
クラス変数
class Foo
  @@class_var = 100
  def hoge
    @@class_var += 1
  end

  def self.piyo
    @@class_var = 0
  end
end


foo = Foo.new
p f.hoge #=> 101

foo2 = Foo.new
p foo2.hoge #=> 102

p Foo.piyo #=> 0
クラスインスタンス変数
class Foo
  @class_instance_var = 'class instance var'

  def hoge
    @class_instance_var
  end

  def self.piyo
    @class_instance_var
  end
end

class Bar < Foo
end

foo = Foo.new
p foo.hoge #=> nil

p Foo.piyo #=> class instance var

p Bar.piyo #=> nil
attr_accessor・attr_writor・attr_reader
def Foo
  attr_accessor :name

  def initialize
    @name = 'kobaken'
  end
end

foo = Foo.new
p foo.name #=> kobaken
foo.name = 'koba'
def Foo
  attr_writer :name

  def initialize
    @name = 'kobaken'
  end

  def get_name
    @name
  end
end

foo = Foo.new
p foo.name #=> NoMethodError: undefined method `name' for #<Bar:(barインスタンスのアドレス) @name="koba">
p foo.get_name #=> kobaken
foo.name = 'koba'
p foo.get_name #=> koba
def Foo
  attr_reader :name

  def initialize
    @name = 'kobaken'
  end
end

foo = Foo.new
p foo.name #=> kobaken
foo.name = 'koba' #=> NoMethodError: undefined method `name=' for #<Piyo:(piyoインスタンスのアドレス) @name="kobaken">

メソッド

インスタンスメソッド
class Foo
  def hoge
    'hogehoge'
  end
end

foo = Foo.new
p foo.hoge #=> hogehoge
p Foo.hoge #=> NoMethodError: undefined method `hoge' for Foo:Class
クラスメソッド(特異メソッド)
class Foo
  def self.hoge
    'hoge'
  end
end

p Foo.hoge #=> hoge
p Foo::hoge #=> hoge
class Foo
  class << self
  def hoge
    'hoge'
  end

  def piyo
    'piyo'
  end
end

p Foo.hoge #=> hoge
p Foo::hoge #=> hoge
p Foo.piyo #=> piyo
p Foo::piyo #=> piyo
class Foo
end

foo = Foo.new
def foo.hoge
  'hoge'
end
p foo.hoge #=> hoge

other_foo = Foo.new
p other_foo.hoge #=> NoMethodError: undefined method `hoge' for #<Foo:(other_fooのアドレス)>
引数
class Foo
  def hoge(str)
    "#{str}_hogehoge"
  end

  def piyo(str, num)
    num.times { p "#{str}_piyo" }
  end
end

foo = Foo.new
p foo.hoge('koba') #=> koba_hogehoge
foo.piyo('koba', 3) #=> koba_piyo koba_piyo koba_piyo
class Foo
  def hoge(str='koba')
    "#{str}_hoge"
  end

  def piyo(str, num=3)
    num.times { p "#{str}_piyo" }
  end
end

foo = Foo.new
p foo.hoge #=> koba_hoge
foo.piyo('koba') #=> koba_piyo koba_piyo koba_piyo
foo.piyo('koba', 1) #=> koba_piyo
可変長引数
def hoge(*args)
  p args
end

hoge('hoge', 'piyo', 'foo', 'bar') #=> ["hoge", "piyo", "foo", "bar"]
キーワード引数
def hoge(name: 'kobaken', age: 21)
  p "My name is #{name}, I am #{age}."
end

hoge #=> My name is kobaken, I am 21.
hoge('こばけん', 18) #=> My name is こばけん, I am 18.
オプション引数
def hoge(**options)
  p options
end

hoge(hobby: '声優', age: 21, name: 'kobaken') #=> {:hobby=>"声優", :age=>21, :name=>"kobaken"}
ブロック引数
def hoge(name, &block)
  bloack.call(name)
end

hoge('kobaken') { |n| p n } #=> kobaken

今回はここまで。
次回はブロック、Proc、yield、クロージャ正規表現についてまとめていきます。

ではノシ