簡體   English   中英

在塊的范圍內定義一個方法,同時仍然可以在Ruby中訪問全局范圍,而無需塊參數?

[英]Define a method within a block's scope, while still having access to the global scope in Ruby, without block arguments?

我想簡化一些測試。 具體來說,我想定義一個塊聲明方法,在該塊中,您可以訪問特殊的輔助方法,同時還可以訪問測試上下文。 像這樣:

def assert_metric(report, metric, &block)
  def sum(value, *filters)
    filters.each do |filter|
      assert_equal value, report.sum(metric, filter)
    end
  end
  instance_eval(&block)
end

assert_metric report, :select_count do
  sum 1
  sum 1, :bookmark, :like
  sum 0, :vote
end

正確的方法是什么?

約束*:

  • sum方法是在當前正在執行的測試的上下文中執行的(因此您可以執行assert_equal並訪問所有實例變量。
  • sum在該塊之外不可用
  • 您不會產生一個塊參數(即do |test_context|...

有任何想法嗎?

您似乎以為def sum就像Python中的嵌套函數一樣工作。 沒有。 這將在測試類上定義一個方法。 無法僅在另一個方法中定義一個方法-方法屬於類或對象。 但是,您可以定義一個僅存在於其中的實現該方法的對象。

如果我正確理解了您的要求,則最接近的等效內容可能是:

require 'delegate'

def assert_metric(report, metric, &block)
  ctx = SimpleDelegator.new(self)
  ctx.singleton_class.class_eval do
    define_method(:sum) do
      filters.each {|filter| assert_equal value, report.sum(metric, filter)}
    end
  end
  ctx.instance_eval(&block)
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM