先頭は小文字のアルファベットかアンダースコア
以下の範囲をスコープとする
- ブロック
- メソッド定義
- クラス・モジュール定義
- トップレベル(その変数が定義されたファイル内のトップレベルがスコープとなる)
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
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
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
可読性を高めるために、数値リテラルの途中に「1_000_000
」のようにアンダースコアを含めることができる
シングルクォート、または、ダブルクォートで記述する
ダブルクォート中では#{...}
を用いて式展開ができる
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"