Tutorial_Ruby
Rubyのチュートリアル
Apps
puts "Hello World!"
Hello World!
関数
引数なし
def f1
puts "Hello World!"
end
f1
f1()
Hello World!
Hello World!
引数あり
def f1(name)
puts "Hello #{name}!"
end
f1("World")
f1("Hogehoge")
Hello World!
Hello Hogehoge!
デフォルト引数
def f1(name = "World")
puts "Hello #{name} !"
end
f1
f1()
f1("hogehoge")
f1(name = "hogehoge")
Hello World !
Hello World !
Hello hogehoge !
Hello hogehoge !
クラス
クラスの宣言
class SampleClass
def initialize(name = "World")
@name = name
end
def printName()
puts @name
end
end
sample = SampleClass.new("Hoge")
sample.printName
# これはエラー。
# sample.name
# sample.@name
Hoge
分割宣言
class SampleClass
def initialize(name = "World")
@name = name
end
def printName()
puts @name
end
end
class SampleClass
# getterとsetterを両方宣言する。
attr_accessor :name
end
sample = SampleClass.new("Hoge")
puts "sample.respond_to?('name') : #{sample.respond_to?('name')}"
sample.printName
sample.name = "Piyo"
sample.printName
# これはエラー。
# sample.name
# sample.@name
sample.respond_to?('name') : true
Hoge
Piyo
配列
each
list = ["hoge", "piyo", "fuga"]
if list.respond_to?("each")
list.each do |v|
puts v
end
end
join
list = ["hoge", "piyo", "fuga"]
if list.respond_to?("join")
puts list.join(", ")
end
main宣言
if __FILE__ == $0
puts $0
puts "Hello World"
end
%記法
if __FILE__ == $0
# ダブルクォート記法
puts %!Hello #{ARGV[0]}\!!
puts %Q!Hello\! Hello\! #{ARGV[0]}\!!
# シングルクォート記法
puts %q!Hello\! Hello\! #{ARGV[0]}\!!
end
Hello !
Hello! Hello! !
Hello! Hello! #{ARGV[0]}!
配列
def printNameAndValue(name, value)
puts "#{name} : #{value}"
end
if __FILE__ == $0
list1 = Array.new
printNameAndValue("list1", list1)
list2 = Array.new(5)
printNameAndValue("list2", list2)
list3 = list2
list3[2] = "hoge"
printNameAndValue("list2", list2)
printNameAndValue("list3", list3)
list4 = Array.new(5) do |i|
"None#{i}"
end
printNameAndValue("list4", list4)
end
list1 : []
list2 : [nil, nil, nil, nil, nil]
list2 : [nil, nil, "hoge", nil, nil]
list3 : [nil, nil, "hoge", nil, nil]
list4 : ["None0", "None1", "None2", "None3", "None4"]
ブラケット構文(部分配列の取得)
DATA_LENGTH = 10
if __FILE__ == $0
# 配列の初期化
data = (0..DATA_LENGTH-1).to_a
puts data.join(",")
# 添字2から5つ分
puts data[2, 5].join(",")
# 添字2から添字5まで
puts data[2..5].join(",")
# 添字2から上限まで
puts data[2, DATA_LENGTH].join(",")
# 後ろから3つ目から2個
puts data[-3, 2].join(",")
# 後ろから3つ目から2個
puts data[-3, 2].join(",")
# 後ろから7つ目から添字5まで
puts data[-7..5].join(",")
end
0,1,2,3,4,5,6,7,8,9
2,3,4,5,6
2,3,4,5
2,3,4,5,6,7,8,9
7,8
7,8
3,4,5
fetch(配列の外の添字でアクセスする)
DATA_LENGTH = 10
if __FILE__ == $0
data = (0..DATA_LENGTH-1).to_a
# 添字5を取得
puts data.fetch(5, 'X')
# 添字10は存在しない。Xを取得。
puts data.fetch(10, 'X')
end
ディープコピー(clone)
DATA_LENGTH = 10
if __FILE__ == $0
data = (0..DATA_LENGTH-1).to_a
data2 = data.clone
# 値は同じ
puts data == data2
# 実態は別
puts data.equal?(data2)
# コピー先の値を変更してみる。
data2[5] = 15
# コピー先は当然変わっているが・・・
puts data2.join(",")
# コピー元は変わらない
puts data.join(",")
end
set
重複排除される配列
require 'set'
def addToSet(sets, value)
if sets.add?(value)
puts '追加されました。'
else
puts '追加されませんでした。'
end
end
if __FILE__ == $0
# 重複排除される。
# 順序は保持されない。
sets = Set['b', 'a', 'c', 'a']
puts sets
addToSet(sets, 'a')
addToSet(sets, 'd')
puts sets
end
#<Set: {"b", "a", "c"}>
追加されませんでした。
追加されました。
#<Set: {"b", "a", "c", "d"}>
hash(Javaで言うMap, Pythonで言うdict)
if __FILE__ == $0
sampleHash = Hash['hoge', 10, 'piyo', 20, 'fuga', 30]
puts sampleHash
puts sampleHash['hoge']
# エラーにはならない。
puts sampleHash['foo']
sampleHash.each do |k, v|
puts "key : #{k} , value : #{v}"
end
end
{"hoge"=>10, "piyo"=>20, "fuga"=>30}
10
key : hoge , value : 10
key : piyo , value : 20
key : fuga , value : 30
generator
if __FILE__ == $0
gen = Enumerator.new do |y|
y << 'first'
y << 'second'
y << 'third'
end
puts gen.next
puts gen.next
puts gen.next
end
first
second
third
class
クラス宣言
class SampleClass
# コンストラクタ
def initialize(value)
# インスタンス変数
@value = value
@privateValue = 'privateValue'
end
def sampleFunc()
puts "This is sampleFunc."
end
# public :sampleFunc
# デフォルトはパブリック。
# privateメソッド
def privateSampleFunc()
return @privateValue
end
private :privateSampleFunc
def putsPrivateValue()
puts self.privateSampleFunc()
end
# クラスメソッド。インスタンスを生成しなくても呼べる。
def self.classMethod()
puts "This is classMethod."
end
attr_accessor :value
end
宣言したクラスの使用
require_relative 'lib/Sample'
if __FILE__ == $0
hoge = SampleClass.new('hoge')
piyo = SampleClass.new('piyo')
puts hoge.value
p piyo.value
hoge.sampleFunc()
hoge.putsPrivateValue()
# privateなので呼べない。
# hoge.privateSampleFunc()
SampleClass.classMethod()
end
継承
# 親クラス
class SuperClass
attr_accessor :value
def initialize(value)
@value = value
end
# 抽象メソッド
# 直接抽象メソッドを実装することはできないので、抽象メソッドとして扱いたいメソッドは親クラスで例外を投げるようにしておく。
def sampleMethod()
raise "Called abstract method: my_print"
end
end
# 継承
class SubClass < SuperClass
def sampleMethod()
puts "This is SubClass."
end
end
require_relative 'lib/ExtendedSample'
if __FILE__ == $0
sub = SubClass.new("hoge")
puts sub.value
puts sub.sampleMethod()
end
hoge
This is SubClass.
例外
def raiseException()
raise RuntimeError.new("RuntimeError!!")
end
if __FILE__ == $0
begin
raiseException()
rescue RuntimeError => e
puts e
end
end
RuntimeError!!
ファイルへのリンク
- 関数
- クラス
- 配列
- main宣言
- 特殊な文字列表現
- コレクション/コンテナ
- 外部ファイルを読み込む
- ジェネレータ
- クラス
- 例外