我有一个班级:
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
,如果这是有意义的......所以我想知道我是否可以轻松地将其缩短。
答案 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
上运行。你显然必须构建你的类/实例方法以适应你想要做的事情,但是这个例子可以帮助你。