构建可链接的ruby api时错误的参数数量错误

时间:2016-12-17 06:43:26

标签: ruby api-design fluent-interface

在我的宝石中,我有一个名为Client的课程,我想这样操作:

client = Client.new
client.content_type('pages').content_type

这意味着我想设置一个属性,然后希望立即将它恢复到同一个链中。这就是我到目前为止所做的:

class Client
  attr_reader :content_type

  def initialize(options = {})
    @options = options
  end

  def content_type
    @content_type
  end

  def content_type(type_id)
    @content_type = type_id
    self
  end
end

现在,当我尝试运行client.content_type('pages').content_type时,我得到了:

wrong number of arguments (given 0, expected 1) (ArgumentError)
    from chaining.rb:16:in `<main>'

我做错了什么?我该怎么写得正确?

1 个答案:

答案 0 :(得分:1)

您的方法名称存在冲突。第二种方法是覆盖第一种方法。要么使用不同的名称,要么合并为两者:

class Client
  attr_reader :content_type

  def initialize(options = {})
    @options = options
  end

  def content_type(type_id = nil)
    type_id ? @content_type : set_content_type(type_id)
  end

  def set_content_type(type_id)
    @content_type = type_id
    self
  end
end

顺便说一下,这段代码很臭。除非你有充分的理由,否则你不应该这样做。