如何调用哈希值的方法?

2 ruby methods hash call

在此之前,我询问了一种在给定条件下执行方法的巧妙方法 " 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)

我不明白为什么它应该停止工作,任何人都可以建议如何使它工作?

Ben*_*hes 7

该代码不起作用.它a在添加到散列时执行,而不是从散列中检索它(在irb中尝试).

它在类中不起作用,因为类上没有a定义方法(最终a在实例上定义了一个方法).

尝试实际使用lambdas之类的

{0 => lambda { puts "hello world" }} 
Run Code Online (Sandbox Code Playgroud)

代替


Chu*_*uck 5

首先,你没有在哈希中放入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.