Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

アクセスメソッド

Rubyではオブジェクトの中にあるインスタンス変数に対して外部から直接操作をすることができません。そのため、オブジェクトの中にある情報を操作するためには、それを目的としたメソッドを定義しないといけません。

class Person
  def name
    return @name
  end
  def name=(value)
    @name = value
  end
end

nameメソッドとname=メソッドは、メソッド名が似ていますが同じではありません。nameメソッドはインスタンス変数の値を知るためのメソッドで、name=メソッドはインスタンス変数に代入するためのメソッドです。このようにメソッドを定義することによって、以下のように参照と代入がおこなえます。

class Person
  def name
    return @name
  end
  def name=(value)
    @name = value
  end
end
john = Person.new
john.name = "John"
p john.name  #=> John
bob = Person.new
bob.name = "Bob"
p bob.name   #=> Bob

このようにRubyのオブジェクトが持っているインスタンス変数の値を調べるにはメソッドを定義しないといけません。そのため、このようなメソッドを定義するための機能がRubyには用意されています。

定義 意味
attr_reader :method 参照のみ可能にする
attr_writer :method 変更のみ可能にする
attr_accessor :method 参照と変更の両方を可能にする

このような働きをするメソッドをアクセスメソッド(またはアクセサ)と呼びます。クラス内でアクセスメソッドを定義すると、引数に指定したメソッド名と同じ名前のインスタンス変数とメソッドが定義されます。そのメソッドを呼び出すことによって、作られたインスタンス変数を扱うことができます。

class Greeting
  attr_reader :hello
  attr_writer :bye
  attr_accessor :pardon
end
greeting = Greeting.new
greeting.hello  #=> nil
greeting.bye = 42
greeting.pardon = "sorry"
p greeting.pardon  #=> sorry

末尾の記号

メソッドを定義する時に以下のような記号を付けることもできます。

  • 等号 (=)
  • 疑問符 (?)
  • 感嘆符 (!)

これらの記号をメソッド名の末尾に付けたメソッドは、どのような機能を持っているのかを表しています。ただし、記号が表しているメソッドの機能を備えていたとしても、必ずメソッド名の末尾に記号が付いているわけではありません。

等号

「=」を末尾に付けたメソッドは、代入できることを表しています。先ほどのアクセスメソッドのように、セッターメソッドとして扱うことを表します。「=」を末尾に付けることによって、「左の式 = 右の式」のような代入をおこなえるようになります。

class Person
  # メソッド名の末尾に「=」がないメソッド定義
  def result(value)
    @name = value
  end
end
bob = Person.new
# この形式で値を変更できない
bob.result = "Bob"
NoMethodError: undefined method `result=' for #<Person:0xb7bdb520>
        from (irb):11
        from :0

疑問符

「?」をメソッド名の末尾に付けたメソッドは、習慣的に真偽値を返すメソッドを表します。このようなメソッド名が付けられたメソッドは、呼び出した時にまるで疑問文のように見えます。その疑問に答える値として真偽値を返します。たとえばオブジェクトの値がnilかを調べるnil?メソッドがあります。

p @foo       #=> nil
p @foo.nil?  #=> true
@foo = "foo"
p @foo.nil?  #=> false

nilであった場合はtrueを返し、nilでない場合はfalseを返しています。

感嘆符

レシーバオブジェクトの状態を変える副作用のあるメソッドは「破壊的なメソッド」と呼びます。破壊的なメソッドのメソッド名の末尾に、「!」を付ける習慣があります。しかし、これは習慣であり、すべての破壊的なメソッドに感嘆符が付けてあるわけではありません。

破壊的なメソッドは、レシーバのコピーを作ってそちらの状態を変更するよりも効率がよいように見えますが、副作用が思わぬ問題を引き起こすかもしれません。たとえば文字列の文末にある空白文字を取り除くchopメソッドがあります。

text = "abcde "
# メソッド呼出し
p text.chop  #=> "abcde"
p text       #=> "abcde "
# 破壊的なメソッド呼出し
p text.chop! #=> "abcde"
p text       #=> "abcde"


次のコンテンツ ホームへ戻る