如何在Io中将字符串转换为列表?

8
例如,我想把"hello"变成list(104, 101, 108, 108, 111)list("h", "e", "l", "l", "o")
目前为止,我创建了一个空列表,使用了foreach并自己将每个项追加到列表中,但这并不是一个简洁的方法。

你真的不想知道在 Hel 语言中将字符串转换为列表需要经历什么。;-) - T.E.D.
哈哈.. 如果我曾经创造了一种相当严肃的编程语言,我保证会命名为Hel :) - Jakob
虽然与SO上的Io问题无关,但这是相关的话题。我回滚了你最近所做的标签编辑,因为iolanguage是Io的规范标签。 - draegtun
2
顺便说一句,好问题!让我思考了一段时间。我认为在核心“序列”对象中添加一个“asList”会是一个不错的补充。 - draegtun
不幸的是,"hello" split"world" split("")都不能按预期工作。 - Tino
对于我的两个回答的反对者:问题是尝试在不使用空列表/foreach的情况下给出简洁的答案 :( 但是为了性能,使用空列表/foreach显然是最优的 :) - draegtun
4个回答

5

我的建议:

Sequence asList := method(
  result := list()
  self foreach(x,
    result append(x)
  )
)

虽然性能尚未测试,但避免使用正则表达式应该会起到一定作用。


是的,使用foreach循环会更高效。但是它不够简洁。希望能找到一种简洁高效的解决方案? - draegtun
2
类似这种方法被用于测试之一(参见byteList):https://github.com/stevedekorte/io/blob/master/libs/iovm/tests/correctness/SequenceBitTest.io - dstnbrkr
1
一个小优化:result := list() 预先分配大小为self size的空间 - Tino
对我来说,这段代码无法执行,我将其改为 Sequence asList := method( result := List; self foreach(x, result append(x)))。虽然区别不是很大,但对于像我这样不熟悉 Io 语法和运行时错误消息的人来说,很难找出失败的原因... - Pascal

4

另一种简洁但仍然比foreach解决方案慢的方法是:

Sequence asList := method (
    Range 0 to(self size - 1) map (v, self at(v) asCharacter)
)

2

我有 Io编程语言,版本号为20110905,默认情况下定义了asList方法,因此您可以在不需要任何新定义的情况下使用它。然后您可以使用map方法获取字符编码。

Io 20110905
Io> a := "Hello World"
==> Hello World
Io> a asList
==> list(H, e, l, l, o,  , W, o, r, l, d)
Io> a asList map(at(0))
==> list(72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100)

2
一种方法是使用正则表达式插件:
#!/usr/bin/env io

Regex

myList := "hello" allMatchesOfRegex(".") map (at(0))

但我相信一定有其他(甚至更好的!)方法。


更新 - 关于我的问题评论。在Sequence对象中内置一些东西会很不错。例如:

Sequence asList := method (
    Regex
    self allMatchesOfRegex(".") map (at(0))
)

# now its just
myList := "hello" asList

1
显然在Stack Overflow(或任何其他地方)都没有太多的IO专家出现。对于你的热情点赞 :) - Jakob
这已经太老了。虽然我找不到任何关于如何实际包含一个插件的答案。我应该如何添加正则表达式模块? - Rig
1
@Rig - 正则表达式插件附带于Io。过去在编译时可能会出现问题,但我认为已经修复了(虽然我有一段时间没有尝试过!)。 - draegtun
@Rig - Regex 导入了插件(即向 Sequence 对象添加必要的方法)。在 REPL 中尝试一下,你应该会看到类似于这样的东西 - https://github.com/stevedekorte/io/issues/210#issuecomment-20550324。注意:如果在使用 Regex 方法时出现错误,请检查链接中的完整线程。 - draegtun
我刚想问我们在哪里可以找到最新的插件列表,但是看了一下GitHub!谢谢大家。 - Lorena Nicole
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接