从另一个文件中获取鞋子编辑框的文本字符串

Fetch text string for Shoes edit box from another file

我的应用在 Shoes 3 上运行,包含以下代码

require 'somefile'

Shoes.app do
  stack do
    flow do
      @my_editbox = edit_line
    end
    flow do 
      button "Get Name" do
        @my_editbox.text = "#{@name}"
      end
    end
  end
end

我的外部文件somefile.rb持有

@name = "my name"

点击按钮没有任何反应,我的编辑框仍然是空的。感谢您的帮助!

Shoes 不是这样运作的。 Shoes is not Ruby,只是看起来像Ruby。许多你知道可以在 Ruby 中工作的东西在 Shoes 中根本不起作用,因为 Shoes 是一个用 C 编写的工具包,可以通过直接调用 Ruby API 以 Ruby-ish 方式工作.

require 调用是无法按您预期的方式工作的事情之一。关于其中一些规则的解释令人困惑available on the Shoes website

就我个人而言,我发现 Shoes 非常令人沮丧,而且文档很少,即使以极其有限的方式使用它也不值得使用。祝你好运。

更新

您在下方询问了 "how"。我假设您的意思是,如何在 Shoes 应用程序中正确使用 require 从单独的文件加载代码。

看看 this repo for an example. You can build a normal Ruby class,然后 require 那 class 在你的应用程序中。您可以在 Shoes.app do 块中以正常的 Ruby 方式使用 class。但是(据我所知)由于 self 在块内的变化方式,您无法引入存在于 class/module.

之外的独立实例变量

不过,您可以这样做,而且它确实会按照您期望的方式工作:

# foo.rb
module Foo
  @@name = 'foobar'
end

# test.rb
require './foo.rb'

Shoes.app do
  stack do
    flow do
      @my_editbox = edit_line
    end
    flow do 
      button "Get Name" do
        @my_editbox.text = Foo.class_variable_get(:@@name)
      end
    end
  end
end

我在这里创建了一个带有 class 变量的模块,因为在未实例化的对象中使用实例变量没有意义。

当然还有其他方法可以做到这一点,您可能会找到 other examples on GitHub(尽管您可能需要调整该查询以获得更多结果),但这是一个功能示例来完成您概述的任务。