在此之前,我询问了一种在给定条件下执行方法的巧妙方法 " Ruby是一种在条件上执行函数的巧妙方法."
解决方案和响应时间很长,但是,在实现时,拥有lambda的哈希会很快变得丑陋.所以我开始尝试.
以下代码有效:
def a()
puts "hello world"
end
some_hash = { 0 => a() }
some_hash[0]
Run Code Online (Sandbox Code Playgroud)
但是,如果我将它包装在一个类中它停止工作:
class A
@a = { 0 => a()}
def a()
puts "hello world"
end
def b()
@a[0]
end
end
d = A.new()
d.b()
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它应该停止工作,任何人都可以建议如何使它工作?
该代码不起作用.它a在添加到散列时执行,而不是从散列中检索它(在irb中尝试).
它在类中不起作用,因为类上没有a定义方法(最终a在实例上定义了一个方法).
尝试实际使用lambdas之类的
{0 => lambda { puts "hello world" }}
Run Code Online (Sandbox Code Playgroud)
代替
首先,你没有在哈希中放入lambda.你将调用的结果放在a()当前的上下文中.
鉴于此信息,请考虑您班级中的代码含义.类定义的上下文是类.因此,您定义一个名为的实例方法a,并将一个类实例变量分配给包含a当前上下文中调用结果的哈希.当前上下文是A类,而A类没有调用的类方法a,因此您尝试将不存在的方法的结果放在那里.然后在实例方法中b,您尝试访问一个名为的实例变量@a- 但没有一个.的@a类中的上下文中定义属于类本身,而不是任何特定实例.
首先,如果你想要一个lambda,你需要制作一个lambda.其次,您需要清楚类和该类的实例之间的区别.
如果要在某些条件下创建要调用的方法名称列表,可以这样做:
class A
def self.conditions() { 0 => :a } end
def a
puts "Hello!"
end
def b(arg)
send self.class.conditions[arg]
end
end
Run Code Online (Sandbox Code Playgroud)
这将条件哈希定义为类的方法(使其易于访问),并且哈希仅包含要调用的方法的名称,而不是lambda或类似的东西.因此,当您调用时b(0),它send本身就是A.conditions [0]中包含的消息,即a.