如何将变量包含到 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”)中,有不同的按钮调用以打开不同的屏幕,例如Home34Screen
、Apple34Screen
、Banana34Screen
等
我希望能够复制脚本配方 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 method
const_get' for
非常感谢您的建议!
(关于规则的注意事项:看来我应该用 'comment' 来回应,或者如果我想澄清的话,可以编辑我的 post - 我选择 'Post your Answer' 作为我的评论较长,需要格式化和编辑我原来的 post 可能会导致混淆。就论坛规则而言,这是我的注释。)
我无法找到如何将变量号包含到屏幕名称中(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”)中,有不同的按钮调用以打开不同的屏幕,例如Home34Screen
、Apple34Screen
、Banana34Screen
等
我希望能够复制脚本配方 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 method
const_get' for
非常感谢您的建议!
(关于规则的注意事项:看来我应该用 'comment' 来回应,或者如果我想澄清的话,可以编辑我的 post - 我选择 'Post your Answer' 作为我的评论较长,需要格式化和编辑我原来的 post 可能会导致混淆。就论坛规则而言,这是我的注释。)