Skip to content

Instantly share code, notes, and snippets.

@okmr-d
Created March 27, 2016 05:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save okmr-d/a8f28a13427b77dac00c to your computer and use it in GitHub Desktop.
Save okmr-d/a8f28a13427b77dac00c to your computer and use it in GitHub Desktop.
Rubyの勉強

基礎

変数と定数

ローカル変数

先頭は小文字のアルファベットかアンダースコア

以下の範囲をスコープとする

  • ブロック
  • メソッド定義
  • クラス・モジュール定義
  • トップレベル(その変数が定義されたファイル内のトップレベルがスコープとなる)
foo = 'foofoo'

def display_foo
  puts foo # NameErrorが発生
end

puts foo # "foofoo"と表示
display_foo

グローバル変数

$から始まる必要がある。どこからでも参照・変更ができる。 必要なければ使うべきでない。

$foobar = 'foobar'
$undefined # 存在しないグローバル変数を参照した場合はnilが返る

定数

先頭は大文字アルファベット。 再代入できてしまう。警告が表示される。 禁止されてはいないものの再代入を前提とした使い方はすべきでない。

FOO_BAR = 'foo'
FOO_BAR = 'bar' # warning: already initialized constant FOO_BAR
puts FOO_BAR # "bar"と表示

メソッドの中では定数の定義は行えない

def set_foo
  FOO_BAR = 'foo' # dynamic constant assignment (SyntaxError)
end

条件分岐と真偽値

if

falseとnil以外のすべての値は真(0も真!)

n = 2

if n.zero?
  puts '0'
elsif n.even?
  puts '偶数'
elsif n.odd?
  puts '奇数'
else
  puts '偶数でも奇数でもない'
end

クラス

クラス名の先頭は大文字で始まる必要がある。

class MyClass
  # インスタンスメソッド
  def hello
    puts 'Hello!'
  end
end

my_object = MyClass.new # newでインスタンス生成
my_object.hello

インスタンス変数

インスタンスの中だけ参照できる。@から始まる。 外部からインスタンス変数にアクセスするには、そのためのメソッドが必要。 Rubyではインスタンス変数へ代入を行うメソッド名には末尾にイコール(=)をつける。

class MyClass
  def name=(val)
    @name = val
  end

  def name
    @name
  end
end

my_object = MyClass.new
my_object.name = 'John'
puts my_object.name    # "John"

下記のように「attr_accessor :インスタンス変数名」と記述すれば自動的にMyClass#name=MyClass#nameが定義される。

class MyClass
  attr_accessor :name
end

self

class MyClass
  attr_accerssor :name

  def set_default_name
    # name = 'John'   だと、ローカル変数に代入される
    self.name = 'John'
  end

  def display_name
    puts name   # self省略OK
  end
end

my_object = MyClass.new
my_object.set_default_name
my_object.display_name   # => John

初期化

initializeというメソッドを使う。他の言語でいうコンストラクタに相当する。

class MyClass
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

my_object = MyClass.new('John')
my_object.name   # => 'John'

クラスメソッド

class MyClass
  attr_accessor :name

  def self.pair
    [MyClass.new, MyClass.new]
  end
end

MyClass.pair  # => [#<MyClass:...>,#<MyClass:...>]

クラス変数

「@@」から始まる名前で表記する。クラス定義の中やクラスメソッドから参照できる。

class MyClass
  @@name = 'John'

  def name_in_metod
    puts @@name
  end

  def self.name_in_class_method
    puts @@name
  end
end

my_object = MyClass.new
my_object.name_in_metod          # => 'John'
my_object.name_in_class_method   # => 'John'

継承

Rubyは単一継承をサポート

class Parent
  def hello
    puts 'Hello!'
  end

  def hi
    puts 'Hi!'
  end
end

class Child < Parent
  # Parent.hiをオーバーライド
  def hi
    super   # Parent.hi が呼び出される
    puts 'Hi!!'
  end
end

child = Child.new
child.hello   # 'Hello!'
chile.hi      # 'Hi!' 'Hi!!' と順に表示

モジュール

「インスタンス化できないクラスのようなもの」

module Brainfsck
  class Parser
    #何か素敵な実装
  end
end

module Whitespace
  class Parser
    #何か素敵な実装
  end
end

# ::を用いて参照する
Brainfsck::Parser    # => Brainfsck::Parser
Whitespace::Parser   # => Whitespace::Parser

主な組み込みクラス

数値(Numeric)

可読性を高めるために、数値リテラルの途中に「1_000_000」のようにアンダースコアを含めることができる

文字列(String)

シングルクォート、または、ダブルクォートで記述する ダブルクォート中では#{...}を用いて式展開ができる

puts 'result:\t#{1+1}'   # "result:\t#{1+1}" と表示
puts "result:\t#{1+1}"   # "result: 2" と表示

バックスラッシュで改行を回避

# 改行の手前にバックスラッシュを置くと改行を回避できる
paragraph = "abcdefg, \
             hijklmnop."

# ただし、2行目でインデントすると空白が入る
puts paragraph   # abcdefg,              hijklmnop.

ヒアドキュメント

    str = <<<EOS
一行目
二行目
EOS

# ヒアドキュメントの開始の識別子の直前にハイフンををつけると、終端の識別しをインデントできる
    str = <<<-EOS
一行目
二行目
    EOS

# ヒアドキュメントの開始の識別子のをシングルクォートで囲むことで、式展開やバックスラッシュ記法を無効化できる
    str <<<'EOS'
#{foo}\t#{bar}
EOS

puts str   # "#{foo}\t#{bar}" と表示

%記法 文字列の中でクォートを多用する場合、「%q(It's rainy)」のように記述することで手間を省ける

weather = 'rainy'

# 「%q」式展開とバックスラッシュは無効になる
%q(It's #{weather})   # "It's #{weather}"

# 「%」「%Q」式展開とバックスラッシュが有効
%(It's #{weather})    # "It's rainy"
%Q(It's #{weather})   # "It's rainy"

シンボル(Symbol)

配列(Array)

ハッシュ(Hash)

範囲(Range)

正規表現(Regexp)

%記法の括弧

手続きオブジェクト(Proc)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment