获取Ruby中用作块的方法的名称

时间:2015-06-10 00:35:47

标签: ruby

如果在块中调用某个方法,我该如何获取它的名字?例如,我有这个简单的记录器(改编自Ross Olsen的书 Eloquent Ruby ):

def self.with_logging(text, &block)
  begin
    puts ">> START:  #{text}"
    yield if block_given?
    puts "<< END:    #{text}"
  rescue
    puts "-- FAILED: #{text}"
    raise
  end
end

我使用它来记录对方法foo的调用,如下所示:

with_logging('foo') { foo }

方法名称foo在text参数和with_logging的块中重复。我想删除这个重复,使text参数默认为块中使用的方法的名称,但我如何找到方法的名称?

1 个答案:

答案 0 :(得分:2)

除非使用调查代码解析结果的元编程,否则不可能这样做。

但你可以做相反的事情。给定方法的名称和块的缺失,您可以默认在块中调用该方法。

def self.with_logging(text)
  begin
    puts ">> START:  #{text}"
    block_given? yield : send(text)
    puts "<< END:    #{text}"
  rescue
    puts "-- FAILED: #{text}"
    raise
  end
end