Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否可以在需要类时执行方法?_Ruby - Fatal编程技术网

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

Ruby 是否可以在需要类时执行方法?,ruby,Ruby,我有一门课: class foo GetActiveWindow = Win32API.new("User32","GetActiveWindow", [], 'L') @hwnd = GetActiveWindow.call() def baz #do stuff with @hwnd end end 我认为在任何通常情况下,上面的代码都会以我需要的方式工作。对于运行程序的每个实例,类将获得主窗口的hwnd 然而,在本例中,我通过一个应用程序运行ruby

我有一门课:

class foo
   GetActiveWindow = Win32API.new("User32","GetActiveWindow", [], 'L')
   @hwnd = GetActiveWindow.call()
   def baz
       #do stuff with @hwnd
   end
end
我认为在任何通常情况下,上面的代码都会以我需要的方式工作。对于运行程序的每个实例,类将获得主窗口的hwnd

然而,在本例中,我通过一个应用程序运行ruby脚本,该应用程序总是以这样的方式运行:
需要'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
,如果有意义的话,那就没有意义了。。。所以我想知道我是否可以轻松地设置快捷方式。

只要创建
句柄
访问器,并在需要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

如果希望在
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
上运行。显然,您必须构造类/实例方法来适应您试图做的事情,但是这个示例将使您达到目的。

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

不,类中没有针对
require
的回调。Require只加载和解析文件,类和文件之间没有直接关系(尽管在
Foo.rb
中有
Foo
类是很常见的)。一个文件中可能有多个类,无或一个与文件名不匹配

您可以在初始值设定项中指定句柄,正如您已经发现的(尽管我不明白您为什么不喜欢这种方法:

def initialize()
  @hwnd = GetActiveWindow.call()
end
或者添加一个方法,该方法将
记忆
句柄

def hwnd
  @hwnd ||= GetActiveWindow.call()
end
OP评论后更新:

所以这个类所要做的就是获取一个句柄。你不想实例化它。它也没有任何状态。那么我假设你用类方法来创建这个类:

class Foo
  def self.handle
     ...
  end
end
这样称呼它

Foo.handle

“上面的代码行得通”–你试过吗?你的问题毫无意义。你不需要类,你需要文件。你说“什么时候需要类”是什么意思?Ruby中没有需要类的东西。@JörgWMittag好的。当你需要一个包含类的文件时。我99%肯定你理解了这一点,这是隐含的…@Stefan我没有专门的应用程序来尝试它,但我不明白为什么它不能用于单实例脚本,因为每个脚本在自己的ruby实例中运行。这里的问题是,我在其中运行ruby脚本的应用程序没有对它们进行沙箱处理。因此,应用程序中需要的文件在所有脚本中都是必需的。@Sancarn我问这个问题是因为你在类体中声明了一个实例变量。这个变量对类方法可用,但ot-to-instance方法,即
@hwnd
baz
中是
nil
。您只需将
@hwnd=
部分添加到类主体中,也会做同样的事情。我反对使用
初始化
的主要问题是主观的。但我通常希望
ProgressBar.new()
创建一个新的进度条。在本例中,它只是获取应用程序现有窗口的句柄。也许如果我将类命名为
ProgressBarHelper
会更好…我想这确实是最好的解决方案。我总是担心速度,但可能这个担心放错地方了。我不认为这样多实例化一个对象很重要。除非你衡量了各种解决方案,否则我不会优化。我宁愿优化干净/可测试/简洁的代码。IMHO说,类方法更难重构和测试。