【问题标题】:Inverse of `split` function: `join` a string using a delimeter`split` 函数的逆:`join` 使用分隔符的字符串
【发布时间】:2026-01-16 20:05:01
【问题描述】:

在 Red 和 Rebol(3) 中,您可以使用 split 函数将字符串拆分为项目列表:

>> items: split {1, 2, 3, 4} {,}
== ["1" " 2" " 3" " 4"]

join 将项目列表转换为字符串的对应反函数是什么?它的工作方式应该类似于以下内容:

>> join items {, }
== "1, 2, 3, 4"

【问题讨论】:

  • Ren-C 称之为 delimit,它的特化为 spaced: specialize 'delimit [delimiter: space]unspaced: specialize 'delimit [delimiter: blank]。为了使它们更有用,分隔符省略了空格和空白(R3-Alpha 和 Red 中的“未设置!”和“无!”),然后巧妙地合并分隔符......所以 delimit ["a" if false ["b"] if false ["c"] "d"] {, } 将是 "a, d"。

标签: series rebol rebol3 red


【解决方案1】:

目前还没有内置函数,你必须自己实现它:

>> join: function [series delimiter][length: either char? delimiter [1][length? delimiter] out: collect/into [foreach value series [keep rejoin [value delimiter]]] copy {} remove/part skip tail out negate length length out]
== func [series delimiter /local length out value][length: either char? delimiter [1] [length? delimiter] out: collect/into [foreach value series [keep rejoin [value delimiter]]] copy "" remove/part skip tail out negate length length out]
>> join [1 2 3] #","
== "1,2,3"
>> join [1 2 3] {, }
== "1, 2, 3"

每个请求,这里是分成更多行的函数:

join: function [
    series 
    delimiter
][
    length: either char? delimiter [1][length? delimiter] 
    out: collect/into [
        foreach value series [keep rejoin [value delimiter]]
    ] copy {} 
    remove/part skip tail out negate length length 
    out
]

【讨论】:

  • 函数放在多行上会更容易阅读和理解。
【解决方案2】:

以下功能有效:

myjoin: function[blk[block!] delim [string!]][
    outstr: ""
    repeat i ((length? blk) - 1)[
        append outstr blk/1
        append outstr delim
        blk: next blk ]
    append outstr blk ]

probe myjoin ["A" "B" "C" "D" "E"] ", "

输出:

"A, B, C, D, E"

【讨论】:

    【解决方案3】:

    rejoin 有一个旧的修改

    rejoin: func [
        "Reduces and joins a block of values - allows /with refinement." 
        block [block!] "Values to reduce and join" 
        /with join-thing "Value to place in between each element" 
    ][ 
        block: reduce block 
        if with [ 
            while [not tail? block: next block][ 
                insert block join-thing 
                block: next block
           ] 
           block: head block 
        ] 
        append either series? first block [ 
           copy first block
        ] [
           form first block
        ] 
        next block 
    ]
    

    这样称呼它重新加入/使用 [..] 分隔符

    但我很确定,还有其他甚至更旧的解决方案。

    【讨论】:

      最近更新 更多