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

时间:2018-12-21 04:39:56

标签: ruby shoes

我的应用程序在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"

单击按钮不会执行任何操作,并且我的编辑框将保持空白。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

鞋子不是这样工作的。 Shoes is not Ruby,它看起来只有Ruby。您知道在Ruby中工作的许多事情根本无法在Shoes中工作,因为Shoes是用C编写的工具包,可以通过直接调用Ruby API以Ruby式的方式工作。

require呼叫是无法按您期望的方式进行的事情之一。关于其中一些规则available on the Shoes website,有一个令人困惑的解释。

我个人认为,鞋子实在令人沮丧,而且文献记录不多,即使以极其有限的方式使用它也不值得使用。祝你好运。

更新

您在下面询问了“方法”。我想你的意思是,如何在Shoes应用中正确使用require从单独的文件中加载代码。

this repo为例。您可以先构建a normal Ruby class,然后在您的应用中require构建该类。您可以通过常规的Ruby方法在Shoes.app do块中使用该类。但是(据我所知),由于self在块内的更改方式,您不能提取存在于类/模块外部的独立实例变量。

不过,您可以执行以下操作,并且可以按照您期望的方式工作:

# 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

在这里,我创建了一个带有类变量的模块,因为在没有实例化的东西中使用实例变量是没有意义的。

当然还有其他方法可以执行此操作,并且您可能会找到other examples on GitHub(尽管您可能需要调整该查询以获取更多结果),但这是一个功能性的示例,可以完成您的任务已经概述了。