【问题标题】:Manipulating symbols in ruby在 ruby​​ 中操作符号
【发布时间】:2019-05-10 14:29:45
【问题描述】:

我正在尝试获取一组符号,

a = [:apple, :banana ,:grape, :black]

并根据最后一个字母在每个符号的末尾添加一个字符串。如果符号以e 结尾,则添加"hello",否则添加"hi"。我想得到:

[:applehello, :bananahi]

我做到了:

n = []
a.each do |b|
  if (b[-1] == "e")
    n.push b.to_s + "hello"
  else
    n.push b.to_s + "hi"
  end
end
p n

我必须把它转换成字符串。如何获得符号的最终输出?

也使用了 sub-

a.each do |q|


if (q[-1]=="e")
    then n.push q.to_s.sub(/e/,"ehello")
  else
    n.push q.to_s.sub(/\z/,"ahi")
  end
end

p n

【问题讨论】:

  • Ursus 的评论是正确的。您需要将每个符号转换为字符串,以便对其进行变异,然后将新字符串转换为符号。
  • :grape:blacka 中发生了什么?

标签: ruby string symbols


【解决方案1】:

使用to_sym 有一个符号返回

a = [:apple, :banana , :grape, :black]
a.map do |s|
  (s.to_s + (s[-1] == 'e' ? 'hello' : 'hi')).to_sym
end

另一种选择

a = [:apple, :banana , :grape, :black]
a.map do |s|
  "#{s}#{s[-1] == 'e' ? 'hello' : 'hi'}".to_sym
end

【讨论】:

  • 谢谢 +1 我想通过 sub 或 gsub 做什么?
  • 哪一部分?虽然它似乎不适用于 sub/gsub
  • 相同的代码,但使用 gsub 或 sub 检查最后一个字母并输入 hi 或 hello
  • 事情是我们做的更多的是串联而不是替换。另一种方法是"#{s}#{s[-1] == 'e' ? 'hello' : 'hi'}".to_sym
  • 甚至是:"#{s}#{s[-1] == 'e' ? 'hello' : 'hi'}",但前导冒号可能会在所有标点符号中丢失。
【解决方案2】:

尝试了以下,

a.map { |x| "#{x}#{x.to_s.last == 'e' ? 'hello' : 'hi'}".to_sym }
# => [:applehello, :bananahi, :grapehello, :blackhi]

【讨论】:

    【解决方案3】:
    a.map{|sym| sym.to_s.sub(/.\z/) do
      |c| case c; when "e" then "hello"; else "hi" end.to_sym
    end}
    # => [:applhello, :bananhi, :graphello, :blachi]
    

    【讨论】:

    • 请添加一些解释。
    • OP 似乎不想丢失最后一个字符,而只是追加 hello/hi
    • 我使用 sub 提出了我的解决方案
    猜你喜欢
    • 2010-12-26
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多