Ruby中类外部无法访问继承方法的GTK3窗口开发问题
无法调用Win.show?拆解Ruby GTK3的类方法与实例方法问题
让我来帮你理清这个报错的原因,以及快速修复的方案:
首先看你收到的错误信息:
Traceback (most recent call last): ./Main.rb:19:in `<main>': undefined method `show' for Win:Class (NoMethodError)
这个错误的核心是你搞混了类方法和实例方法的调用对象:
show是Gtk::Window提供的实例方法——意思是,只有当你创建了Win类的具体窗口对象(也就是实例)之后,才能调用这个方法。- 而你写的
Win.show是在给Win这个类本身发消息,但Win类并没有定义show这个类方法,所以Ruby会抛出未定义方法的错误。
再看你的代码:
require 'gtk3' class Win < Gtk::Window include Gtk def initialize super set_title "RubyCalculator" set_default_geometry 300 , 300 #show show works here fine end end Win.new Win.show # I get error here Gtk.main
这里Win.new确实创建了一个窗口实例,但你没有把这个实例保存下来,反而直接去调用类的show方法,这就导致了报错。
两种可行的修复方案
方案1:保存实例并调用实例的show方法
这是最直观的方式,把创建的窗口实例赋值给变量,然后调用这个实例的show方法:
require 'gtk3' class Win < Gtk::Window include Gtk def initialize super set_title "RubyCalculator" set_default_geometry 300 , 300 end end # 保存实例到变量,调用实例方法show win = Win.new win.show Gtk.main
方案2:在initialize方法内调用show
如果你希望创建窗口时自动显示,可以直接在类的初始化方法里调用show(因为initialize是实例方法,内部调用的show也是实例方法):
require 'gtk3' class Win < Gtk::Window include Gtk def initialize super set_title "RubyCalculator" set_default_geometry 300 , 300 show # 这里调用的是当前实例的show方法 end end Win.new # 创建实例时自动显示窗口 Gtk.main
核心记住:GTK3的控件操作方法几乎都是实例方法,必须通过类创建的具体对象来调用,而不是直接给类本身调用哦~
内容的提问来源于stack exchange,提问作者user9715379
相关产品推荐
相关产品推荐

