有没有办法将整数传递给方法链?

时间:2018-04-13 13:22:52

标签: ruby

示例:

7.cars.2.doors

我将cars方法添加到Integer,它将返回一个CarBuilding对象。

然后,此CarBuilding对象需要接收消息2,该消息将进行一些处理并自行返回。

最后将在此CarBuilding对象上调用doors

任何一种花哨的元编程能够做到这一点吗?

注意:我不想传递参数。只需使用方法链。

2 个答案:

答案 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
相关问题