[讀書筆記]Ruby元編程3

TestCase 測試

ensure 不管有無錯誤,都將進入該代碼塊

例子

require 'test/unit'

module Kernel
  def using(id)
    begin
      yield
    ensure
      id.dispose
    end
  end
end

class TestUsing < Test::Unit::TestCase
  class Resource
    def dispose
      @disposed = true
    end
    def disposed?
      @disposed
    end
  end
  def test_disposes_of_resources
    r = Resource.new
    using(r){}
    assert r.disposed?
  end
  def test_disposes_of_resources_in_case_of_exception
    r = Resource.new
    assert_raises(Exception){
      using(r){
        raise Exception
      }
    }
    assert r.disposed?
  end
end


local_variables 獲取當前作用域下可訪問的變量

class TestClass
  v = 3
  def print
    var = 2 
    puts "#{local_variables.join(',')} in method"
  end
  puts "#{local_variables.join(',')} in class"
end

TestClass.new.print

instance_eval 訪問私有方法和變量 修改self對象

例1

class MyClass
  def initialize
    @v = 3
    @v += 1
  end
end

c = 2

obj = MyClass.new
s = obj.instance_eval{@v + c}

s1 = obj.instance_eval do
  self
  @v + c + 5
end

puts "s:#{s},s1:#{s1}"

例子2

class C
  def initialize
    @x , @y = 1, 2
  end
end


puts C.new.instance_eval{[@x,@y]}.join(',')

例子3 # lambda , proc #方法塊

variable = lambda{
  @var = 10
}
method = lambda{
  instance_eval &variable
  "put" if @var > 100
  "push" if @var < 100
}


puts method.call





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章