(Ruby) 将字符串转换为一行代码?

问题描述 投票:0回答:3

因此,对于我正在开发的游戏,假设我在咒语的评论框中添加了一些文本:

<secondary effects: [["Flame", 15, true], ["Poison", 0.08, true]]>

通过使用切片功能,我可以将文本缩小为:

[["Flame", 15, true], ["Poison", 0.08, true]]

然后将其存储在

data
变量中,所以

data = "[["Flame", 15, true], ["Poison, 0.08, true]]"

现在,我怎样才能将这段文本转换为代码,这样我就可以在法术的伤害过程中设定一个条件,例如:

if data[0][2] == true then *something* end

显然,我不能在文本上使用

eval
来将其变成数据。

ruby string text conditional-statements
3个回答
4
投票

您的示例是一个 JSON 一致字符串(修复缺失的

"
后)。因此,我只会使用
JSON.parse
:

data = '[["Flame", 15, true], ["Poison", 0.08, true]]'
#=> "[[\"Flame\", 15, true], [\"Poison\", 0.08, true]]"

require 'json'
JSON.parse(data)
#=> [["Flame", 15, true], ["Poison", 0.08, true]]

1
投票

在 Ruby 中将数据放入注释的整个想法是一种味道。但首先,让我从字面上回答你的问题:任何字符串is都是 Ruby 中的代码行。要查看它是否是有效行,您只需

eval
它:

string = "[{foo: 1}, {bar: 2}]"
data = eval string
data[0][:foo] #=> 1

在 Ruby 中,我们通常尝试做相反的事情:将注释填充到代码中,而不是尝试将代码填充到注释中。更准确地说,是编写不言自明的代码,无需注释即可理解。我们称之为文学编程。


0
投票

下面是一个非常简单快速的解决方案。

data = eval('[["Flame", 15, true], ["Poison", 0.08, true]]')

请确保“火焰”周围有两个引号,但“毒药”没有。如果这是一个拼写错误,那么上面的内容将按原样工作,但如果不是这种情况,那么您将需要向任何给定的字符串添加适当的引号。

如果您不想使用 eval 那么您可以执行如下操作。

'[["Flame", 15, true], ["Poison", 0.08, true]]'.gsub(/[\[\]]/,'').split(",").each_slice(3).to_a
© www.soinside.com 2019 - 2024. All rights reserved.