トップ 一覧 ping 検索 ヘルプ RSS ログイン

Ruby はじめにの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Ruby はじめに
[Perl]
[Ruby][Perl]

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
!!手続きオブジェクト
[初めてのJavaScript(関数)]
[クロージャ]
 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