是否可以在需要类时执行方法?

时间:2017-09-06 14:17:14

标签: ruby

我有一个班级:

class foo
   GetActiveWindow = Win32API.new("User32","GetActiveWindow", [], 'L')
   @hwnd = GetActiveWindow.call()
   def baz
       #do stuff with @hwnd
   end
end

我认为在任何通常的情况下,上面的代码都会以我需要的方式工作。对于正在运行的程序的每个实例,该类将获得主窗口的hwnd。

但是在这种情况下,我通过一个始终运行的应用程序运行ruby脚本,require 'foo.rb'只调用@hwnd = GetActiveWindow.call()一次但不再调用。

是否有类似以下的方法:

class foo
   GetActiveWindow = Win32API.new("User32","GetActiveWindow", [], 'L')
   def baz
       #do stuff with @hwnd
   end
   def onrequire()
       @hwnd = GetActiveWindow.call()
   end
end

我知道您可以定义一个initialise()方法,只要调用class.new()就会调用该方法,但是对于此应用程序,它并不能真正理解'}调用方法new,如果这是有意义的......所以我想知道我是否可以轻松地将其缩短。

3 个答案:

答案 0 :(得分:1)

只需创建handle访问者,并在需要hwnd时自行使用。

class Foo
   GetActiveWindow = Win32API.new("User32","GetActiveWindow", [], 'L')

   def baz
     # do stuff with handle
     PostMessage(handle, ...)
   end

   def handle
     @hwnd ||= GetActiveWindow.call()
   end
end

答案 1 :(得分:1)

假设您的意思是Foo而不是foo,因为后者在Ruby中是一个无效的常量名称。

不,课程中require没有这样的回调。只需加载并解析文件,类和文件之间没有直接关系(尽管在Foo中有foo.rb类是很常见的)。文件中可能有多个类,无,或者与文件名不匹配的类。

你可以在初始化程序中分配句柄,正如你已经发现的那样(虽然我不明白为什么你不喜欢这种方法:

def initialize()
  @hwnd = GetActiveWindow.call()
end

或添加memoizes句柄

的方法
def hwnd
  @hwnd ||= GetActiveWindow.call()
end

OP评论后更新:

因此,所有这个课程都需要获得一个句柄。而且你不想实例化它。它也没有任何状态。然后我想你用类方法把它变成一个类:

class Foo
  def self.handle
     ...
  end
end

并像这样称呼它

Foo.handle

答案 2 :(得分:0)

如果您希望在require上调用该方法,那么您只需将onrequire电话移到课堂外:

# foo.rb
class Foo
   GetActiveWindow = Win32API.new("User32","GetActiveWindow", [], 'L')
   def baz
       #do stuff with @hwnd
   end
   def self.on_require
       @hwnd = GetActiveWindow.call()
   end
end

Foo.on_require

在这种情况下,最后一行在require上运行。你显然必须构建你的类/实例方法以适应你想要做的事情,但是这个例子可以帮助你。