示例:
7.cars.2.doors
我将cars
方法添加到Integer,它将返回一个CarBuilding
对象。
然后,此CarBuilding
对象需要接收消息2
,该消息将进行一些处理并自行返回。
最后将在此CarBuilding对象上调用doors
任何一种花哨的元编程能够做到这一点吗?
注意:我不想传递参数。只需使用方法链。
答案 0 :(得分:3)
不,这是不可能的。
使用正常的消息发送语法,消息必须是有效的标识符。 2
不是有效的标识符,标识符不能以数字开头。这在语法上是不合法的。
可以使用元编程定义名为2
的方法。但请注意,这是名称 2
,而不是Integer
2
。显然,不可能使用普通的消息发送语法来调用这样的方法(也不可能使用普通的方法定义语法来定义它)。
class CarBuilding
define_method(:'2') do
CarBuildingWithDoors.new(2)
end
end
7.cars.public_send(:'2').doors
答案 1 :(得分:1)
因为以数字开头的名称无效,您可以使用下划线:
class CarBuilding
def method_missing(method, *args, &block)
raise NoMethodError unless method =~ /\A_\d*\z/
puts "do something with #{method[1..-1].to_i}"
return self
end
def doors
puts "doors"
end
end
class Integer
def cars
return CarBuilding.new
end
end
puts 7.cars._2.doors