ruby 有 global_variable_set 吗?

Lin*_*nus 5 ruby

如果要在 Ruby 中制作一个 Tk GUI 并使用不同的全局变量名称制作多个复选框。最有效的方法是什么?

我找到了instance_variable_set,但这不适合我的场景。

我想知道是否有像global_variable_set.

例如。

    info = [orange,apple,banana,grape,watermelon]
    $var = TkVariable.New
    info.each_with_index {|inf,index|
      TkCheckButton.new(frame1) do 
        text "#{inf}"
        onvalue "#{inf}"
        variable global_variable_set("$var#{index}", inf)
      end
    end
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 3

\n

我想知道是否存在像global_variable_set.

\n
\n\n

是\xe2\x80\x94it\的Module#module_eval。这是您的代码,经过重新设计以使用它:

\n\n
require \'tk\'\n\n$root = TkRoot.new\n$frame1 = Tk::Tile::Frame.new $root\n\ncheck_buttons = []\ninfo = %w[orange apple banana grape watermelon]\ninfo.each_with_index do |inf,index|\n  global_name = "$var#{index}"\n\n  cb = Tk::Tile::CheckButton.new $frame1\n  cb.text "#{inf}"\n  cb.onvalue "#{inf}"\n\n  create_global = "#{global_name} = TkVariable.new \'\'"\n  Module.module_eval create_global\n\n  assign_value = "#{global_name}.value = \'#{inf}\'"\n  Module.module_eval assign_value\n\n  connect_variable = "cb.variable #{global_name}"\n  Module.module_eval connect_variable\n\n  check_buttons.push cb\nend\n\np Kernel.global_variables.select {|e| e.id2name.start_with? \'$var\'}\np info.length.times.map {|i| Module.module_eval "$var#{i}.value"}\np check_buttons.map {|e| (e.cget :variable).value}\n\nTk.mainloop\n
Run Code Online (Sandbox Code Playgroud)\n\n

该程序产生以下输出:

\n\n
[:$var0, :$var1, :$var2, :$var3, :$var4]\n["orange", "apple", "banana", "grape", "watermelon"]\n["orange", "apple", "banana", "grape", "watermelon"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者您可以使用更通用的方法Kernel#eval来代替。

\n\n

因此,如果您确实想要动态创建全局变量,那么它是可用的。

\n\n

Checkbutton方法的Tcl文档可以在这里cget看到。

\n\n

我在 Windows 7 上使用 Ruby 2.2.5 对此进行了测试。

\n