| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Ruby はじめに

提供: MyMemoWiki
2020年2月16日 (日) 04:31時点におけるPiroto (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

Ruby はじめに

Ruby | Perl |

http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb

演算

http://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html

四則演算(整数、浮動小数点数)
  1. puts 1+2
  2. puts 1.0/3.0
べき乗
  1. puts 2**10
剰余
  1. puts 10 % 3
絶対値
  1. puts ((1-3).abs)
乱数
  1. puts rand
  2. puts rand(11) # 0-10
乱数 Seedを使う
  1. srand 999
  2. puts rand
Math
  1. puts Math::PI
  2. puts Math::E
  3. puts Math.sqrt(5)
  4. puts Math.log(100)
  5. puts Math::E**Math.log(100)
各種演算
  1. puts 'hello' + ' world' # 文字列の足し算
  2. puts '0' * 4 # 文字列の掛け算 0000
  3. puts 0.to_s * 4 # 数値->文字列変換
  4. puts '9'.to_i * 2 # 文字列->整数変換
  5. puts 1.to_f / 3.to_f # 整数->浮動小数点数変換
  6.  
標準入力 gets(tring)
  1. puts gets
  2.  
末尾の改行を除く chomp
  1. puts
  2. val = gets.chomp
  3. puts '<-- ' + val + ' -->
  4.  
演算子もメソッド
  1. puts 1.+ 1
  2.  
文字列メソッド
  1. puts 'hello'.reverse
  2. puts 'hello is ' + 'hello'.length.to_s + ' chars.'
  3. puts 'abcd'.upcase
  4. puts 'ABCD'.downcase
  5. puts 'abcd efg'.capitalize
  6.  
センタリング、左寄せ、右寄せ
  1. puts '0123456789' * 2
  2. puts 'hello'.center(20)
  3. puts 'hello'.ljust(20)
  4. puts 'hello'.rjust(20)


配列

  1. dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
  2. puts dates[0]
  3. puts dates[1]
  4. puts dates[2]
sortメソッド
  1. dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
  2. dates2 = dates.sort
  3. dates2.each do |date|
  4. puts date
  5. end

ハッシュ

  1. has = {}
  2. has['one'] = 1
  3. has['two'] = 2
  4. has['three'] = 3
  5.  
  6. puts has['one']

制御

http://www.ruby-lang.org/ja/man/html/_C0A9B8E6B9BDC2A4.html#unless

比較

  • 比較演算子
  1. puts 1 > 0.5
  2. puts 0.5 == 0.5
  3. puts 1 != 1.0
  • ショートサーキット
  1. c1 = true
  2. c2 = false
  3.  
  4. def chk1
  5. c2 = true
  6. return true
  7. end
  8. def chk2
  9. c1 = false
  10. return false
  11. end
  12.  
  13. if chk1 || chk2
  14. puts true
  15. end
  16. puts c1.to_s + "," + c2.to_s

分岐

if
  1. t = gets.chomp.to_i
  2. if t < 12
  3. puts 'good moring.'
  4. else
  5. if t == 12
  6. puts 'good afternoon.'
  7. else
  8. puts 'good evening.'
  9. end
  10. end
  • elsif
  1. a = true
  2. b = false
  3. c = true
  4. if a and b and c
  5. puts "all true"
  6. elsif a or b or c
  7. puts "any one or more true"
  8. else
  9. puts "all false"
  10. end
unless

ifと逆の条件判定

  1. c1 = false
  2.  
  3. unless c1
  4. puts "c1 false"
  5. else
  6. puts "c1 true"
  7. end
  8.  
case
  1. def greet(hour)
  2. case hour
  3. when 5 .. 11
  4. msg = "morning"
  5. when 12
  6. msg = "afternoon"
  7. when 13 .. 20
  8. msg = "evening"
  9. else
  10. msg = "night"
  11. end
  12. return "good " + msg
  13. end
  14.  
  15. puts greet(22)

繰り返し

for
  1. ary = ['a','b','c','d']
  2. for c in ary
  3. puts c
  4. end
while
  1. s = gets.chomp;
  2. while!= 'q'
  3. puts s
  4. s = gets.chomp;
  5. end
  6.  
eachメソッド
  1. dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
  2. dates.each do |date|
  3. puts date
  4. end
timesメソッド
  1. 3.times do
  2. puts 'hello'
  3. end

例外

例外を発生
  • ランタイム
  1. def foo
  2. raise "Runtime Error!"
  3. end
  4. foo
  • 文法
  1. def bar
  2. raise SyntaxError.new("invalid syntax")
  3. end
  4. bar
例外処理
  • begin、rescue、else、ensure
  1. def foo(x , y)
  2. begin
  3. ret = x / y
  4. rescue ZeroDivisionError
  5. ret = nil
  6. else
  7. ret = nil
  8. ensure
  9. end
  10. return ret
  11. end
  12. puts foo(100, 0)

メソッドの作成

  1. def greeting time
  2. if time < 12
  3. puts 'good moring.'
  4. else
  5. if time == 12
  6. puts 'good afternoon.'
  7. else
  8. puts 'good evening.'
  9. end
  10. end
  11. end
  12.  
  13. greeting 12
  14.  
戻値
  1. def greeting time
  2. msg =
  3. if time < 12
  4. msg = 'good moring.'
  5. else
  6. if time == 12
  7. msg = 'good afternoon.'
  8. else
  9. msg = 'good evening.'
  10. end
  11. end
  12. msg #メソッドからの返り値は単純にメソッドの最後の行の値
  13. end
  14.  
  15. puts greeting(21)
不定個の引数を渡す

「*」を使う

  1. def prtPrms(*prms)
  2. for p in prms
  3. print p, " "
  4. end
  5. end
  6.  
  7. prtPrms(1, 2, 3)
特異メソッド
  • 特異メソッドは特定のインスタンスに固有のメソッド
  1. class Foo
  2. end
  3.  
  4. f = Foo.new
  5. def f.hello
  6. puts 'hello.'
  7. end
  8. f.hello
クラスメソッド
  1. class Foo
  2. def Foo.name
  3. puts 'foo'
  4. end
  5. end
  6.  
  7. Foo.name
ブロック付きメソッド
  1. def foo
  2. puts "pre process."
  3. yield
  4. puts "post process."
  5. end
  6.  
  7. foo { puts "main process." }

Webページ取得例

  1. require "open-uri"
  2. open("http://typea.info", :proxy => 'http://proxy:8080') { |uri|
  3. puts uri.read
  4. }

テキストファイル表示例

  1. File.open("C:\\test.txt") {|file|
  2. while w = file.gets
  3. print w
  4. end
  5. }

変数

http://www.ruby-lang.org/ja/man/html/_CAD1BFF4A4C8C4EABFF4.html

種類 書式 スコープ
ローカル変数 小文字または、'_'ではじめる 宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでで
インスタンス変数 @ではじめる インスタンス変数はそのクラスまたはサブクラスのメソッド。特異メソッドから参照不可
クラス変数 @@で始める クラスの特異メソッド、インスタンスメソッドなどから参照/代入
グローバル変数 $ではじめる プログラムのどこからでも
定数 大文字ではじめる 定数が定義されたクラス/モジュール定義の中。再代入で警告
  • メンバー変数 class Hoge
  1. def sayName
  2. puts @name
  3. end
  4. def giveName name
  5. @name = name #@をつける
  6. end
  7. end
  8.  
  9. h = Hoge.new
  10. h.giveName('foo')
  11. h.sayName
  • 定数
  1. CONST_VALUE = 'constant' #大文字ではじめる
  2. CONST_VALUE = 'change value' #warning
  3. puts CONST_VALUE

クラス

クラスの拡張

組み込み整数クラスを拡張してみる

  • 同じクラスを再定義すると、前のクラス定義に追加されていきます。
  • メソッドを再定義した場合には後のものが上書きしますので、前のものは失われます。
  1. class Integer
  2. def to_chinese
  3. s = self.to_s
  4.  
  5. cs = ['零', '壱','弐','参','四','伍',
  6. '六', '七','八','九']
  7.  
  8. ret =
  9. i = 0
  10. while i < s.length
  11. ret += cs[s[i ,1].to_i]
  12. i += 1
  13. end
  14. return ret
  15. end
  16. end
  17.  
  18. puts 123456.to_chinese
クラスを作る
  1. class Hoge
  2. def sayName
  3. puts "hoge"
  4. end
  5. end
  6.  
  7. h = Hoge.new
  8. h.sayName
アクセッサ

メンバー変数はpublicにはできない。 アクセッサを定義するか、attr_reader、attr_writer、 attr_accessorを使う

  1. class Foo
  2. def initialize(name, age)
  3. @name = name
  4. @age = age
  5. end
  6. attr_reader :name
  7. #以下と同じ
  8. #def name
  9. # return @name
  10. #end
  11. attr_accessor :age
  12. end
  13. f = Foo.new('Foo', 12)
  14. f.age = 20
  15. puts f.name + ' ' + f.age.to_s
initialize メソッド

定義されていれば、生成時に呼び出される

  1. class Hoge
  2. def initialize
  3. @name = 'bar'
  4. end
  5. def sayName
  6. puts @name
  7. end
  8. def giveName name
  9. @name = name
  10. end
  11. end
  12.  
  13. Hoge.new.sayName
initializeに引数を渡す
  1. class Hoge
  2. def initialize name
  3. @name = name
  4. end
  5. def sayName
  6. puts @name
  7. end
  8. end
  9.  
  10. Hoge.new('hogehoge').sayName
クラス変数
  • 1.6より実装。`@@'で始まる変数
  1. class Foo
  2. @@name = 'foo'
  3. end
  4.  
  5. puts Foo.new

手続きオブジェクト

初めてのJavaScript(関数) | クロージャ |

  1. alert = Proc.new do
  2. puts "Error!"
  3. end
  4.  
  5. alert.call
引数を取れる
  1. alert = Proc.new do | reason |
  2. puts "Error! " + reason
  3. end
  4.  
  5. alert.call 'Zero Divide'
  6. alert.call 'Memory Leak'

モジュール

  • 名前空間
  • mix-in

名前空間(メソッド)

  1. module Foo
  2. def self.hoge
  3. puts "Foo.hoge"
  4. end
  5. end
  6.  
  7. module Bar
  8. def self.hoge
  9. puts "Bar.hoge"
  10. end
  11. end
  12.  
  13. Foo::hoge
  14. Bar::hoge

名前空間(クラス)

  1. module Foo
  2. class FooCls
  3. def hoge
  4. puts "Foo.hoge"
  5. end
  6. end
  7. end
  8.  
  9. module Bar
  10. class BarCls
  11. def hoge
  12. puts "Bar.hoge"
  13. end
  14. end
  15. end
  16.  
  17. Foo::FooCls.new.hoge
  18. Bar::BarCls.new.hoge

mix-in

  1. module Foo
  2. def foo
  3. puts "Foo"
  4. end
  5. end
  6.  
  7. module Bar
  8. def bar
  9. puts "Bar"
  10. end
  11. end
  12.  
  13. class MixinCls
  14. include Foo
  15. include Bar
  16. end
  17.  
  18. m = MixinCls.new
  19. m.foo
  20. m.bar

オブジェクト指向

継承

  1. class Foo
  2. def initialize(name)
  3. @name = name
  4. end
  5. def hoge
  6. puts @name
  7. end
  8. end
  9.  
  10. class Bar < Foo
  11. def initialize(name)
  12. @name = name
  13. end
  14. end
  15.  
  16. Bar.new('hoge').hoge
オーバーライド
  1. class Foo
  2. def name(name)
  3. @name = name
  4. end
  5. def hoge
  6. puts "Foo:" + @name
  7. end
  8. end
  9.  
  10. class Bar < Foo
  11. def hoge
  12. puts "Bar:" + @name
  13. end
  14. end
  15.  
  16. b = Bar.new
  17. b.name('Bar')
  18. b.hoge