1

我想做这样的事情:

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.winnerandres.condensation.looserres.condensation.showresault

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

4

3 回答 3

4

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

然而,Jay Fields 有一个访问量很大的博客条目,它展示了如何在方法中定义一个方法。

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

正如Alex D在评论中提醒我的那样,范围运算符是一种欺骗。

于 2013-05-05T00:59:22.370 回答
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

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

您可以这样计算获胜者:

def calculate_winner
  # something using winner= method
end
于 2013-05-05T00:27:55.313 回答
2

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

Ruby 允许我们在方法内部定义方法,但内部方法不暴露,也不直接可用。

内部方法只能从外部方法中使用,因此,在您的示例中,winner,looser并且showresault只能从内部访问condensation

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

于 2013-05-05T00:34:21.407 回答