def内部def或如何做到这一点

时间:2013-05-05 00:23:13

标签: ruby

我想做这样的事情:

class Result<<ActiveRecord::Base

  def condensation
    #some code here that calculates @winner and @looser and @condresalut
    def winner
      @winner
    end

    def looser
      @looser
    end

    def showresault
      @condresalut
    end
  end

end

以便我可以致电res.condensation.winnerres.condensation.looser以及res.condensation.showresault

最好的方法是什么?显然这种方式不起作用,我得到了nils。

3 个答案:

答案 0 :(得分:4)

确实可以这样做。不确定意图是什么,因为有人问过,但不确定这个问题是否得到澄清。

然而Jay Fields有一个well visited blog entry,它显示了如何在方法中定义方法。

class Class
 def def_each(*method_names, &block)
   method_names.each do |method_name|
     define_method method_name do
        instance_exec method_name, &block
     end
   end
 end
end

尽管使用attr_reader技术可能更好地为您的定义提供了方法。

至于调用嵌套定义的方法:

def testing
  def testing2
    'it worked'
  end
end

puts testing::testing2

Thogh Alex D在评论中提醒我,范围操作符是一种欺骗。

答案 1 :(得分:2)

def condensation
  @condensation ||= Struct.new(:winner, :looser, :showresult).new
end

def winner
  @winner ||= condensation.winner
end

def winner=(winner)
  @winner = winner
end

... and so on

我按结果更改了resault,我想用show_result更改showresult

您可以像这样计算胜利者:

def calculate_winner
  # something using winner= method
end

答案 2 :(得分:2)

我认为你不能从这里到达那里。

Ruby允许我们在方法内定义方法,但内部方法不会公开或直接可用。

内部方法仅在外部方法中可用,因此,在您的示例中,winnerloosershowresault只能从condensation内部访问。< / p>

可以创建lambdasprocs并将它们作为闭包整体返回,这样您就可以访问condensation内的内部值,但是,实际上,似乎你混淆了类与方法的使用,并试图使方法的行为类似于具有访问器的类。相反,我可能会在一个类中创建一个类,然后从那里开始。