1.动态方法 (send && fine_method) -- 动态派发 , 动态创建, 动态内省 缩减代码
- 2.0.0p247 :071 > class Computer
- 2.0.0p247 :072?> def initialize(computer_id, data_source)
- 2.0.0p247 :073?> @id = computer_id
- 2.0.0p247 :074?> @data_source = data_source
- 2.0.0p247 :075?> data_source.methods.grep(/^get_(.)_info$/) {
- 2.0.0p247 :076 > Computer.define_component $1
- 2.0.0p247 :077?> end
- 2.0.0p247 :078?>
- 2.0.0p247 :079 > def
- 2.0.0p247 :080 > self.define_component(name)
- 2.0.0p247 :081?> define_method(name)
- 2.0.0p247 :082?> info = @data_source.send "get_#{name}_info", @id
- 2.0.0p247 :083?> price = @data_source.send "get_#{name}_price", @id
- 2.0.0p247 :084?> result = "#{name.capitalize} : #{info} ($#{price})"
- 2.0.0p247 :085?> return "* {result}" if price >= 100
- 2.0.0p247 :086?> result
- 2.0.0p247 :087?> end
- 2.0.0p247 :088?> end
- 2.0.0p247 :481 > class SubClass
- 2.0.0p247 :482?> define_method :method_added do |name|
- 2.0.0p247 :483 > puts "# added a method #{name}"
- 2.0.0p247 :484?> end
- 2.0.0p247 :485?> end
- 2.0.0p247 :492 > SubClass.new.method_added "niaho"
- # added a method niaho
- => nil
- 2.0.0p247 :493 >
2.method_missing() 方法
覆写 method_missing
- 2.0.0p247 :107 > 'to_aaaa'.to_s =~ /^to_(.*)/; p $1
- "aaaa"
- => "aaaa"
- 2.0.0p247 :108 > "aaaa".to_sym
- => :aaaa
- 2.0.0p247 :109 >
- 2.0.0p247 :130 > p="aasfasfs.asfsa.asf".gsub('.','_')
- => "aasfasfs_asfsa_asf"
- 2.0.0p247 :131 >
- class Table
- def method_missing(id,*args,&block)
- return as($1.to_sym, *args,&block) if id.to_s =~ /^to_(.*)/
- return rows_with($1.to_sym => args[0]) if id.to_s =~ /^rows_with_(.*)/
- super
- end
- end
- class MyOpneStruct
- def initialize
- @attributes = {}
- end
- def method_missing(name,*args)
- attribute = name.to_s
- if attribute =~ /=$/
- @attributes[attribute.chop] = args[0]
- else
- @attributes[attribute]
- end
- end
- end
- icecream = MyOpneStruct.new
- icecream.flavor = "vanilla"
- icecream.flavor