[读书笔记]Ruby 元编程2

--方法

#将字符串转换成符号

String # to_sym()    

String # intern()

#将符号转换成字符串

Symbol # to_s()

Symbol # id2name()

#动态定义方法

define_method 

例子1:

class MyClass
  define_method :my_method do |my_arg|
    puts my_arg * 7 
  end
end

obj = MyClass.new
obj.send('my_method'.to_sym,7)

例子2:

class TestClass
  def get_mode_info(name)
    "#{name}_1"
  end
  def get_code_info(name)
    "#{name}_2"
  end
end


class MyClass
  def init(cl)
    @objTest = cl
    @objTest.methods.grep(/^get_(.*)_info/){
      MyClass.define_component($1)
    }
  end
  
  def self.define_component(name)
    define_method(name){
      @objTest.send("get_#{name}_info",name)
    }
  end
end


obj = MyClass.new
obj.init(TestClass.new)

puts obj.mode

method_missing() 幽灵方法


class MyOpenStruct
  def initialize
    @attributes = {}
  end
  
  def method_missing(name, *args)
    attribute = name.to_s
    if attribute =~ /=$/
      @attributes[attribute.chop] = args
    else
      @attributes[attribute]
    end
  end
end

ice = MyOpenStruct.new
ice.flavor = ["vanilla","test"]
puts ice.flavor


puts 'ice'.methods.grep(/^chop/)

respond_to? 判断方法是否存在

class TargetClass
  def test_info
    'test'
  end
end

class TestClass
  def initialize(classN)
    @obj = classN
  end
  
  def method_missing(name,*args)
    super if !@obj.respond_to?("#{name}_info")
    puts @obj.send("#{name}_info")
  end
  
  def respond_to?(method)
    @obj.respond_to?("#{method}_info") || super
  end
  
  def testT
  end
end

obj = TestClass.new(TargetClass.new)
puts obj.respond_to?("test".to_sym)
puts obj.respond_to?(:testT)

#移除继承的方法

undef_method

class MyTest
  
  instance_methods.each do |m|
    undef_method m unless m.to_s =~ /^_|method_missing|respond_to?/
  end
  
  def method_missing(name , *args)
    "#{name}(#{args.join(',')})"
  end
end

puts MyTest.display
obj = MyTest.new
puts obj.display


yield 调用block

block_given? 判断是否有block回调

例子:

class TCl
  def a_method
    return yield if block_given?
    'no block'
  end
end

obj = TCl.new
puts obj.a_method{'do test'}
puts obj.a_method




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值