我想做这样的事情:
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.winner
和res.condensation.looser
以及res.condensation.showresault
。
最好的方法是什么?显然这种方式不起作用,我得到了nils。
答案 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允许我们在方法内定义方法,但内部方法不会公开或直接可用。
内部方法仅在外部方法中可用,因此,在您的示例中,winner
,looser
和showresault
只能从condensation
内部访问。< / p>
您可以创建lambdas
或procs
并将它们作为闭包整体返回,这样您就可以访问condensation
内的内部值,但是,实际上,似乎你混淆了类与方法的使用,并试图使方法的行为类似于具有访问器的类。相反,我可能会在一个类中创建一个类,然后从那里开始。