Ruby はじめに
ナビゲーションに移動
検索に移動
目次
Ruby はじめに
http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb
演算
http://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html
四則演算(整数、浮動小数点数)
- puts 1+2
- puts 1.0/3.0
べき乗
- puts 2**10
剰余
- puts 10 % 3
絶対値
- puts ((1-3).abs)
乱数
- puts rand
- puts rand(11) # 0-10
乱数 Seedを使う
- srand 999
- puts rand
Math
- puts Math::PI
- puts Math::E
- puts Math.sqrt(5)
- puts Math.log(100)
- puts Math::E**Math.log(100)
各種演算
- puts 'hello' + ' world' # 文字列の足し算
- puts '0' * 4 # 文字列の掛け算 0000
- puts 0.to_s * 4 # 数値->文字列変換
- puts '9'.to_i * 2 # 文字列->整数変換
- puts 1.to_f / 3.to_f # 整数->浮動小数点数変換
標準入力 gets(tring)
- puts gets
末尾の改行を除く chomp
- puts
- val = gets.chomp
- puts '<-- ' + val + ' -->
演算子もメソッド
- puts 1.+ 1
文字列メソッド
- puts 'hello'.reverse
- puts 'hello is ' + 'hello'.length.to_s + ' chars.'
- puts 'abcd'.upcase
- puts 'ABCD'.downcase
- puts 'abcd efg'.capitalize
センタリング、左寄せ、右寄せ
- puts '0123456789' * 2
- puts 'hello'.center(20)
- puts 'hello'.ljust(20)
- puts 'hello'.rjust(20)
配列
- dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
- puts dates[0]
- puts dates[1]
- puts dates[2]
sortメソッド
- dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
- dates2 = dates.sort
- dates2.each do |date|
- puts date
- end
ハッシュ
- has = {}
- has['one'] = 1
- has['two'] = 2
- has['three'] = 3
- puts has['one']
制御
http://www.ruby-lang.org/ja/man/html/_C0A9B8E6B9BDC2A4.html#unless
比較
- 比較演算子
- puts 1 > 0.5
- puts 0.5 == 0.5
- puts 1 != 1.0
- ショートサーキット
- c1 = true
- c2 = false
- def chk1
- c2 = true
- return true
- end
- def chk2
- c1 = false
- return false
- end
- if chk1 || chk2
- puts true
- end
- puts c1.to_s + "," + c2.to_s
分岐
if
- t = gets.chomp.to_i
- if t < 12
- puts 'good moring.'
- else
- if t == 12
- puts 'good afternoon.'
- else
- puts 'good evening.'
- end
- end
- elsif
- a = true
- b = false
- c = true
- if a and b and c
- puts "all true"
- elsif a or b or c
- puts "any one or more true"
- else
- puts "all false"
- end
unless
ifと逆の条件判定
- c1 = false
- unless c1
- puts "c1 false"
- else
- puts "c1 true"
- end
case
- def greet(hour)
- case hour
- when 5 .. 11
- msg = "morning"
- when 12
- msg = "afternoon"
- when 13 .. 20
- msg = "evening"
- else
- msg = "night"
- end
- return "good " + msg
- end
- puts greet(22)
繰り返し
for
- ary = ['a','b','c','d']
- for c in ary
- puts c
- end
while
- s = gets.chomp;
- while s != 'q'
- puts s
- s = gets.chomp;
- end
eachメソッド
- dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
- dates.each do |date|
- puts date
- end
timesメソッド
- 3.times do
- puts 'hello'
- end
例外
例外を発生
- ランタイム
- def foo
- raise "Runtime Error!"
- end
- foo
- 文法
- def bar
- raise SyntaxError.new("invalid syntax")
- end
- bar
例外処理
- begin、rescue、else、ensure
- def foo(x , y)
- begin
- ret = x / y
- rescue ZeroDivisionError
- ret = nil
- else
- ret = nil
- ensure
- end
- return ret
- end
- puts foo(100, 0)
メソッドの作成
- def greeting time
- if time < 12
- puts 'good moring.'
- else
- if time == 12
- puts 'good afternoon.'
- else
- puts 'good evening.'
- end
- end
- end
- greeting 12
戻値
- def greeting time
- msg =
- if time < 12
- msg = 'good moring.'
- else
- if time == 12
- msg = 'good afternoon.'
- else
- msg = 'good evening.'
- end
- end
- msg #メソッドからの返り値は単純にメソッドの最後の行の値
- end
- puts greeting(21)
不定個の引数を渡す
「*」を使う
- def prtPrms(*prms)
- for p in prms
- print p, " "
- end
- end
- prtPrms(1, 2, 3)
特異メソッド
- 特異メソッドは特定のインスタンスに固有のメソッド
- class Foo
- end
- f = Foo.new
- def f.hello
- puts 'hello.'
- end
- f.hello
クラスメソッド
- class Foo
- def Foo.name
- puts 'foo'
- end
- end
- Foo.name
ブロック付きメソッド
- def foo
- puts "pre process."
- yield
- puts "post process."
- end
- foo { puts "main process." }
Webページ取得例
- require "open-uri"
- open("http://typea.info", :proxy => 'http://proxy:8080') { |uri|
- puts uri.read
- }
テキストファイル表示例
- File.open("C:\\test.txt") {|file|
- while w = file.gets
- print w
- end
- }
変数
http://www.ruby-lang.org/ja/man/html/_CAD1BFF4A4C8C4EABFF4.html
種類 | 書式 | スコープ |
---|---|---|
ローカル変数 | 小文字または、'_'ではじめる | 宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでで |
インスタンス変数 | @ではじめる | インスタンス変数はそのクラスまたはサブクラスのメソッド。特異メソッドから参照不可 |
クラス変数 | @@で始める | クラスの特異メソッド、インスタンスメソッドなどから参照/代入 |
グローバル変数 | $ではじめる | プログラムのどこからでも |
定数 | 大文字ではじめる | 定数が定義されたクラス/モジュール定義の中。再代入で警告 |
- メンバー変数 class Hoge
- def sayName
- puts @name
- end
- def giveName name
- @name = name #@をつける
- end
- end
- h = Hoge.new
- h.giveName('foo')
- h.sayName
- 定数
- CONST_VALUE = 'constant' #大文字ではじめる
- CONST_VALUE = 'change value' #warning
- puts CONST_VALUE
クラス
クラスの拡張
組み込み整数クラスを拡張してみる
- 同じクラスを再定義すると、前のクラス定義に追加されていきます。
- メソッドを再定義した場合には後のものが上書きしますので、前のものは失われます。
- class Integer
- def to_chinese
- s = self.to_s
- cs = ['零', '壱','弐','参','四','伍',
- '六', '七','八','九']
- ret =
- i = 0
- while i < s.length
- ret += cs[s[i ,1].to_i]
- i += 1
- end
- return ret
- end
- end
- puts 123456.to_chinese
クラスを作る
- class Hoge
- def sayName
- puts "hoge"
- end
- end
- h = Hoge.new
- h.sayName
アクセッサ
メンバー変数はpublicにはできない。 アクセッサを定義するか、attr_reader、attr_writer、 attr_accessorを使う
- class Foo
- def initialize(name, age)
- @name = name
- @age = age
- end
- attr_reader :name
- #以下と同じ
- #def name
- # return @name
- #end
- attr_accessor :age
- end
- f = Foo.new('Foo', 12)
- f.age = 20
- puts f.name + ' ' + f.age.to_s
initialize メソッド
定義されていれば、生成時に呼び出される
- class Hoge
- def initialize
- @name = 'bar'
- end
- def sayName
- puts @name
- end
- def giveName name
- @name = name
- end
- end
- Hoge.new.sayName
initializeに引数を渡す
- class Hoge
- def initialize name
- @name = name
- end
- def sayName
- puts @name
- end
- end
- Hoge.new('hogehoge').sayName
クラス変数
- 1.6より実装。`@@'で始まる変数
- class Foo
- @@name = 'foo'
- end
- puts Foo.new
手続きオブジェクト
- alert = Proc.new do
- puts "Error!"
- end
- alert.call
引数を取れる
- alert = Proc.new do | reason |
- puts "Error! " + reason
- end
- alert.call 'Zero Divide'
- alert.call 'Memory Leak'
モジュール
- 名前空間
- mix-in
名前空間(メソッド)
- module Foo
- def self.hoge
- puts "Foo.hoge"
- end
- end
- module Bar
- def self.hoge
- puts "Bar.hoge"
- end
- end
- Foo::hoge
- Bar::hoge
名前空間(クラス)
- module Foo
- class FooCls
- def hoge
- puts "Foo.hoge"
- end
- end
- end
- module Bar
- class BarCls
- def hoge
- puts "Bar.hoge"
- end
- end
- end
- Foo::FooCls.new.hoge
- Bar::BarCls.new.hoge
mix-in
- module Foo
- def foo
- puts "Foo"
- end
- end
- module Bar
- def bar
- puts "Bar"
- end
- end
- class MixinCls
- include Foo
- include Bar
- end
- m = MixinCls.new
- m.foo
- m.bar
オブジェクト指向
継承
- class Foo
- def initialize(name)
- @name = name
- end
- def hoge
- puts @name
- end
- end
- class Bar < Foo
- def initialize(name)
- @name = name
- end
- end
- Bar.new('hoge').hoge
オーバーライド
- class Foo
- def name(name)
- @name = name
- end
- def hoge
- puts "Foo:" + @name
- end
- end
- class Bar < Foo
- def hoge
- puts "Bar:" + @name
- end
- end
- b = Bar.new
- b.name('Bar')
- b.hoge
© 2006 矢木浩人