【问题标题】:Working with Ruby class: Capitalizing a string使用 Ruby 类:大写字符串
【发布时间】:2021-01-08 18:23:18
【问题描述】:

我正在努力了解如何使用 Ruby 中的类,并且非常感谢您对此领域的一些见解。目前,我有一个相当简单的任务来转换一个字符串,每个单词的开头都是大写的。例如:

Not Jaden-Cased: "How can mirrors be real if our eyes aren't real"
Jaden-Cased:     "How Can Mirrors Be Real If Our Eyes Aren't Real"

这是我目前的代码:

class String
  def toJadenCase
    split
    capitalize

  end
end

#=> usual case: split.map(&:capitalize).join(' ')


输出:

Expected: "The Moment That Truth Is Organized It Becomes A Lie.",
 instead got: "The moment that truth is organized it becomes a lie."

【问题讨论】:

  • 我不确定你在问什么或你目前期待什么。您当前split 字符串并丢弃结果,然后返回大写字符串。实际可行的代码似乎是所有代码下方的注释。
  • 大声笑我以为我在使用 Class 时必须分离方法

标签: ruby string capitalize


【解决方案1】:

我建议你不要通过添加实例方法来污染核心String 类。相反,只需在方法中添加一个参数来保存字符串。您可以按如下方式执行此操作,方法是对字符串进行小写,然后将 gsub 与正则表达式一起使用。

def to_jaden_case(str)
  str.downcase.gsub(/(?<=\A| )[a-z]/) { |c| c.upcase } 
end
to_jaden_case "The moMent      That trUth is organized, it becomes a lie."
  #=> "The Moment      That Truth Is Organized, It Becomes A Lie."

Ruby 的正则表达式引擎执行以下操作。

(?<=\A| )  : use a positive lookbehind to assert that the following match
             is immediately preceded by the start of the string or a space 
[a-z]      : match a lowercase letter

(?&lt;=\A| ) 可以替换为 negative lookbehind (?&lt;![^ ]),它断言匹配的前面没有空格以外的字符。

请注意,通过将String#gsub 与正则表达式一起使用(与 split-process-join 舞蹈不同),可以保留额外的空格。

当正则表达式匹配空格时,通常会看到匹配的空格 (\s)。例如,这里/(?&lt;=\A|\s)[a-z]/ 工作正常,但有时匹配空格会导致问题,主要是因为它们也匹配换行符 (\n)(以及空格、制表符和一些其他字符)。如果要匹配空格,我的建议是匹配空格字符。如果还要匹配制表符,请使用字符类 ([ \t])。

【讨论】:

  • 正则表达式现在让我害怕 =/,但我想我不可避免地要在某个时候学习它
  • 一位智者曾经说过“没有什么好害怕的,只有害怕自己,还有正则表达式。”。是的,适应正则表达式需要一些时间,但从某种意义上说,它们是一种相当简单的计算机语言,与大多数其他方法相比,它的方法要少得多。您最需要基本知识,包括捕获组、非捕获组、正负后视和前瞻以及命名捕获。还有其他强大的功能,例如\K\G,但他们可以等待。一些程序员觉得它们很有趣,尽管这有时与人格障碍有关。
  • 哈哈大佬,我一定会抽空研究一下的!
【解决方案2】:

试试:

 def toJadenCase
    self.split.map(&:capitalize).join(' ')
 end

【讨论】:

  • 不需要self,顺便说一句。
  • LOOL ffs 我认为类的工作方式不同,但现在明白了,你不需要将它传递给参数,因为参数已经创建。干杯队友
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 2010-12-27
  • 1970-01-01
  • 2021-10-19
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多