Ruby 如果满足条件,则在字符串插值中添加子字符串

Ruby 如果满足条件,则在字符串插值中添加子字符串,ruby,literals,Ruby,Literals,我得到了一个数组,并且必须根据元素的不同,用空格连接与每个元素对应的某些项: 如果元素是字符串string或形式为[string]的数组,则在输出中包括string 如果元素是[string1,string2]格式的数组,则如果string1长度超过一个字符,则在输出中包括“--string1”,否则包括“-string1”。然后在结果中包括“string2” 所以[“猫”,“狗”,“鱼”,“牛”]将输出“猫-狗-鱼-牛”,[“猫”,“蝙蝠”],“鼠标”]将输出“-蝙蝠鼠标” 其他人编写了以下代

我得到了一个数组,并且必须根据元素的不同,用空格连接与每个元素对应的某些项:

  • 如果元素是字符串
    string
    或形式为
    [string]
    的数组,则在输出中包括
    string
  • 如果元素是
    [string1,string2]
    格式的数组,则如果
    string1
    长度超过一个字符,则在输出中包括
    “--string1”
    ,否则包括
    “-string1”
    。然后在结果中包括
    “string2”
  • 所以
    [“猫”,“狗”,“鱼”,“牛”]
    将输出
    “猫-狗-鱼-牛”
    [“猫”,“蝙蝠”],“鼠标”]
    将输出
    “-蝙蝠鼠标”

    其他人编写了以下代码:

    def args_to_string args
      args.map{ |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}*" "
    end
    
    • 我理解,最后的splat
      *
      表示块只接收一个参数是可以的,在这种情况下将是
      nil
    • 然后有一个三元if-Then语句。下一行:

      "#{?-if i[1]}-#{i} #{j}"
      
      如果
      i
      有第二个字符,我想会包含一个额外的连字符

    • 这个
      {}
      中的大括号之间可以放什么?如何仅在满足条件时才包含特定字符串
    • 在上面的例子中,为什么连字符前面有一个问号
    末尾的splat*表示块只接收一个参数是可以的

    否。
    Array*
    带字符串参数与
    join
    相同

    如何仅在满足条件时才包含特定字符串

    你喜欢这样做:

    "#{"foo" if some_contition}"
    
    它实际上在代码中用作
    #{?-if i[1]}

    为什么连字符前面有问号

    保存字符。它是单个字符串的文本<代码>?-相当于
    “-”


    简而言之,请阅读手册。

    让我们试着逐步完成计算

    args = ["cat", ["dog","fish"], ["cow"]]
    
    行动路线是

    args.map { |i,j| j ? "#{ ?- if i[1] }-#{ i } #{ j }" : i } * " "
    
    让我们把它分解一下

    enum = args.map
      #=> #<Enumerator: ["cat", ["dog", "fish"], ["cow"]]:map> 
    
    enum
    的第一个元素被传递给块,块变量的值通过并行(或多重)赋值确定:

    所以
    “cat”
    映射到
    “cat”

    请注意,
    i[1]=>nil
    i
    是一个单字符字符串时,该字符串虽然在示例中未使用,但很重要。接下来,将
    enum
    的第二个元素传递给块

    i,j = enum.next
      #=> ["dog", "fish"] 
    i #=> "dog" 
    j #=> #=> "fish" 
    str = "#{ ?- if i[1] }-#{ i } #{ j }"
      #=> "#{ "-" if "o" }-dog fish"
      #=> "--dog fish" 
    j ? str : i
      #=> "fish" ? "--dog fish" : "dog"
      #=> "--dog fish"
    
    [“狗”、“鱼”]
    因此被映射到
    “--dog-fish”

    “cow”
    被映射到
    “cow”

    因此,我们完成了
    map
    。我已经展示了

    a = enum.each { |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}
      #=> ["cat", "--dog fish", "cow"]
    
    这是怎么回事

    args.map{ |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}
      #=> ["cat", "--dog fish", "cow"]
    
    实现了。最后一步是

    a * " "
      #=> a.join(" ")
      #=> "cat --dog fish cow"
    

    因为是“相当于
    ari.join(str)

    在向下滚动查看图标之前,我可以通过长度来告诉你答案。@sawa,只有当它是我的一个血淋淋的详细答案时,它才是主要为Ruby新手保留的。
    enum.next
      #=>StopIteration: iteration reached an end
    
    a = enum.each { |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}
      #=> ["cat", "--dog fish", "cow"]
    
    args.map{ |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}
      #=> ["cat", "--dog fish", "cow"]
    
    a * " "
      #=> a.join(" ")
      #=> "cat --dog fish cow"