【问题标题】:How can I achieve below requirement in ruby?如何在 ruby​​ 中达到以下要求?
【发布时间】:2014-10-20 18:31:21
【问题描述】:
@custom_column = CustomColumns.configure :projects do |user, tag|
  columns = ModelName.method_name(user,tag)
end

@custom_column.columns should return ["title", "description"]
CustomColumns.projects.columns should return ["title", "description"]

@custom_column1 = CustomColumns.configure :groups do |domain|
  columns = ModelName.method_name(domain)
end

@custom_column1.columns should return => ["desctiption", "created_at"]
CustomColumns.groups.columns should return => ["desctiption", "created_at"]

我尝试了下面的代码来实现上述结果。但我不知道如何在块中传递不同的参数?或者我怎样才能达到上述结果?

module CustomColumns
  class Rule
      attr_accessor :column_for, :columns
  end

  class << self
    attr_accessor :rule
  end

  def self.configure(column_for, &block)
    @column_for = column_for
    @columns = block.call
  end

end

【问题讨论】:

  • 对于初学者来说,看起来你的块需要参数,但你不是 yielding 任何 block.call。例如在第一个示例中,它期望usertag 被发送到块中,而在第二个示例中,它期望domainHere is a quick tutorial on Yielding to Blocks 但还有更多可用的。一旦你了解它是如何工作的,它可能会帮助你弄清楚这一点。
  • 我要问的能不能实现?还是我错过了什么?

标签: ruby configuration arguments block metaprogramming


【解决方案1】:

你想要的都是不可能的。 foo = bar总是被解释为分配给局部变量。它永远不会调用foo= setter。您必须提供明确的接收者。

【讨论】:

  • 还有其他替代方法可以实现这一目标吗?处理上述场景的最佳和首选方法是什么?
  • 不清楚“上述场景”是什么。你扔了一堆没有解释的代码,并问是否可以使该代码运行,答案是否定的。如果你想知道一个人是否可以设计不同的东西,你首先必须解释什么是“那个”。
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
相关资源
最近更新 更多