Ruby 在符号和字符串之间转换

Ruby 在符号和字符串之间转换,ruby,Ruby,有人问我这个问题: strings.each do |s| symbols.push(s.to_sym) end print symbols strings.each do |string| if strings.include? "s" strings.gsub! (/s/, .to_sym) end symbols.push (string) end print symbols 我们有一个字符串数组,希望以后用作散列键,但我们更希望它们是符号 创建一个新变量

有人问我这个问题:

strings.each do |s|
  symbols.push(s.to_sym)
end 

print symbols
strings.each do |string|
  if strings.include? "s"
    strings.gsub! (/s/, .to_sym)
  end
  symbols.push (string)
end

print symbols
我们有一个字符串数组,希望以后用作散列键,但我们更希望它们是符号

  • 创建一个新变量,
    symbols
    ,并在其中存储一个空数组
  • 使用
    .each
    迭代
    字符串
    数组
  • 对于
    strings
    中的每个
    s
    ,使用
    .to_sym
    s
    转换为符号,并使用
    。按
    将新符号添加到
    符号中
    
  • 打印
    符号
    数组
  • 给出的正确答案是:

    strings.each do |s|
      symbols.push(s.to_sym)
    end 
    
    print symbols
    
    strings.each do |string|
      if strings.include? "s"
        strings.gsub! (/s/, .to_sym)
      end
      symbols.push (string)
    end
    
    print symbols
    
    我是这样做的:

    strings.each do |s|
      symbols.push(s.to_sym)
    end 
    
    print symbols
    
    strings.each do |string|
      if strings.include? "s"
        strings.gsub! (/s/, .to_sym)
      end
      symbols.push (string)
    end
    
    print symbols
    
    代码不起作用。我正试图获得这方面的帮助。

    对于数组中的每个字符串,您的代码是“如果字符串包含字母s”,则为“not…”。这意味着它们暗示在循环时使用变量
    s
    来表示每个条目

    这个问题是用经典的数学语言表述的,比如“对于人口O中的每个人p…其中O代表居住在城市C中的所有人的集合…”

    代码不起作用的原因是因为这行代码:

    strings.gsub! (/s/, .to_sym)
    
    那是无效的。
    .to_sym
    方法必须对某些东西进行操作,它不是孤立地工作的。另外,
    strings
    是一个数组,它实际上不是一个字符串。在循环中,
    字符串
    表示单个条目。应该是这样的:

    >> strings = ["cat", "deer", "mouse"]
    >> symbols = strings.map { |s| s.to_sym }
    #> [:cat, :deer, :mouse]
    
    >> symbols = strings.map(&:to_sym)
    #> [:cat, :deer, :mouse]
    
    但这仍然是不对的,因为字符串中不能有符号。对象是字符串或符号,而不是两者


    下面的答案是正确的,因为它将一个符号值推入,并且不需要
    gsub

    正如@tadman提到的,问题根本不是
    gsub
    ,而是迭代数组并对每个元素应用一个操作来创建一个新数组

    您在问题中给出的“正确”答案是可行的,但更典型的Ruby解决方案是使用
    map
    ,如下所示:

    >> strings = ["cat", "deer", "mouse"]
    >> symbols = strings.map { |s| s.to_sym }
    #> [:cat, :deer, :mouse]
    
    >> symbols = strings.map(&:to_sym)
    #> [:cat, :deer, :mouse]
    
    每当您看到这种模式时,只要对块变量调用一个方法,就可以使用更简洁的简写方式,如下所示:

    >> strings = ["cat", "deer", "mouse"]
    >> symbols = strings.map { |s| s.to_sym }
    #> [:cat, :deer, :mouse]
    
    >> symbols = strings.map(&:to_sym)
    #> [:cat, :deer, :mouse]
    

    s
    是引用问题中定义的变量。即使在引用该问题之前,也不要在问题的主体中写下这一点,就好像
    s
    用于表示名为
    strings
    的数组中的每个字符串是一个既定事实。挑剔:
    &
    不仅仅是关于“对块变量调用的单个方法”这是一种更通用的方法,可以将任何内容转换为proc并将结果作为块传递给接收器,例如
    [1,2,3,4,5].detect(&3.method(:==)
    。在前面提到的情况下,它之所以有效是因为实现了。