如何将变量包含到 Ruby 运动屏幕的名称中?

How to include a variable into the name of a Ruby Motion screen?

我无法找到如何将变量号包含到屏幕名称中(Ruby 运动)

@id = "2"

  def button
    open Home{@id}Screen.new(nav_bar: false)
  end

在 URL 之前有一个 # 并且有效,

https://thisistheurl/#{id}.json"

但在上面的方法中不起作用。哈希被解释为注释掉。

非常感谢您的帮助!

你所说的 "screen" 是一个常量。 #{...} 语法在字符串文字中起作用,这就是 URL 示例中的 URL 。所以解决这个问题的一种方法是回答问题 "How do I get a constant from a string?" 答案是 const_get:

def button
  name = "Home#{@id}Screen" # => "Home2Screen"
  screen = self.class.const_get(name)  # => Home2Screen
  open screen.new(nav_bar: false)
end

这是一种元编程,在Ruby中很常见。但是,在这种情况下,有更好的方法可以完成您想要的事情。解决这个问题的另一种方法是回答问题,"How can I create a mapping of numbers to constants?" 答案是一个哈希:

SCREEN_NUMBER_MAP = {
  1 => Home1Screen,
  2 => Home2Screen,
  # ...
}

def button
  screen = SCREEN_NUMBER_MAP[@id] # => Home2Screen
  open screen.new(nav_bar: false)
end

此选项更好,因为它更具声明性且更少 "magic."

感谢你的留言,乔丹!

您的提案 #1 (const_get) 崩溃了(详情如下), 建议 #2 对我来说不切实际。

抱歉,如果我不清楚我想要达到什么结果以及 'what is a screen'。 我的问题不是 'How do I get a constant from a string?',而是如何将常量(例如 id = '34')插入屏幕名称(例如 'Home#Screen') => Home34Screen?

情况:在我的某个屏幕脚本(例如“食谱 34”)中,有不同的按钮调用以打开不同的屏幕,例如Home34ScreenApple34ScreenBanana34Screen

我希望能够复制脚本配方 34,以便它也可以用于配方 58。 现在,我不想将常量 58 插入每个按钮,而是想将 id 从“34”更改为“58”。

这解释了为什么您的建议 #2 不是一个实用的解决方案。

你的提议 #1 很好,但它导致了崩溃。

我的新语法是:

def button_swipeleft
  name = "Tonprobe#{@id}Screen"
  screen = const_get(name)
  open screen.new(nav_bar: false)
end

最初是:

def button_swipeleft
  open Tonprobe2Screen.new(nav_bar: false)
end

提到我正在使用 RubyMotion 可能很重要。 崩溃报告:

2018-02-14 06:22:15.725 plus123[16983:2203916] *** Terminating app due to uncaught exception 'NoMethodError', reason: 'app/screens/ANDERE/9000-TONPROBEN/tonprobe1_screen.rb:69:in button_swipeleft': undefined methodconst_get' for

非常感谢您的建议!

(关于规则的注意事项:看来我应该用 'comment' 来回应,或者如果我想澄清的话,可以编辑我的 post - 我选择 'Post your Answer' 作为我的评论较长,需要格式化和编辑我原来的 post 可能会导致混淆。就论坛规则而言,这是我的注释。)