Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中将字符串转换为大小写_Ruby - Fatal编程技术网

在Ruby中将字符串转换为大小写

在Ruby中将字符串转换为大小写,ruby,Ruby,正在进行一项Ruby挑战,将破折号/下划线分隔的单词转换为驼峰式大小写。只有当原始单词被称为大写时,输出中的第一个单词才应该大写 到目前为止,我的解决方案是: def to_camel_case(str) str.split('_,-').collect.camelize(:lower).join end 然而,camelize:lower是一种rails方法,我相信它不适用于Ruby。有没有同样简单的替代方法?我好像找不到。还是我需要从一个完全不同的角度面对挑战 main.rb:4:in

正在进行一项Ruby挑战,将破折号/下划线分隔的单词转换为驼峰式大小写。只有当原始单词被称为大写时,输出中的第一个单词才应该大写

到目前为止,我的解决方案是:

def to_camel_case(str)
str.split('_,-').collect.camelize(:lower).join 
end
然而,camelize:lower是一种rails方法,我相信它不适用于Ruby。有没有同样简单的替代方法?我好像找不到。还是我需要从一个完全不同的角度面对挑战

main.rb:4:in `to_camel_case': undefined method `camelize' for #<Enumerator: []:collect> (NoMethodError)
    from main.rb:7:in `<main>'

大多数Rails方法都可以添加到基本Ruby项目中,而不必拉入整个Rails源代码

诀窍是找出定义所需方法所需的最小文件量。如果我们转到,我们可以看到camelize是在active_support/inflector/methods.rb中定义的

因此,积极的支持/拐点似乎是一个很好的尝试对象。让我们测试一下:

irb(main)> require 'active_support/inflector'
=> true
irb(main)> 'foo_bar'.camelize
=> "FooBar"
似乎有效。请注意,这假设您之前已经运行了gem安装activesupport。如果没有,则先执行或将其添加到您的GEM文件中。

我假设:

每个单词由一个或多个部分组成。 每个部分由空格、加高和下划线以外的组成字符组成。 每个部分的第一个字符是一个字母。 每个连续的零件对都用连字符或下划线分隔。 需要返回一个字符串,该字符串是通过修改每个部分并删除分隔每个连续部分对的hypen或下划线获得的。 对于每个部分,除第一个字母外,所有字母均应转换为小写字母。 单词每个部分中非字母的所有字符应保持不变。 第一部分的第一个字母保持不变。 除第一个字母外,每个部分的第一个字母如果尚未大写,则应大写。 单词之间用空格隔开。 如果正确描述了问题,可以使用以下方法

R = /(?:(?<=^| )|[_-])[A-Za-z][^ _-]*/
正则表达式可以在自由间距模式下编写,以使其自文档化

R = /
    (?:         # begin non-capture group
      (?<=^| )  # use a positive lookbehind to assert that the next character
                # is preceded by the beginning of the string or a space
    |           # or
      [_-]      # match '_' or '-'
    )           # end non-capture group
    [A-Za-z]    # match a letter
    [^ _-]*     # match 0+ characters other than ' ', '_' and '-'
    /x          # free-spacing regex definition mode

在纯Ruby中,没有Rails,如果str='my-var_name',您可以执行以下操作:

delimiters = Regexp.union(['-', '_'])
str.split(delimiters).then { |first, *rest| [first, rest.map(&:capitalize)].join }

#=> "myVarName"
其中str='My-var_name'结果为MyVarName,因为拆分结果的第一个元素未被触及,而其余元素映射为大写

它仅适用于以破折号/下划线分隔的单词,不使用空格,或者需要按空格分割,然后使用呈现的方法进行映射

此方法使用按分隔符拆分的字符串,如下所述,
用链子拴住。

就在我头顶上,这看起来像是个错误;您希望收集camelize的结果,而不是对collect的结果调用camelize,而不使用块。试试这个:str.split'.''.'.collect&:camelize.joinah是正确的,但我不想大写第一个字符,而且,我得到了一个新的错误消息collect:“undefined method camelize”,用于“隐身战士”:String。如果原始字符串如下:小muffet小姐坐在她的塔夫特上,您希望返回什么字符串?破折号是指连字符吗?分割的部分看起来不太正确。我将使用split/|-/。感谢您提供了非常详细的分类和答案
R = /
    (?:         # begin non-capture group
      (?<=^| )  # use a positive lookbehind to assert that the next character
                # is preceded by the beginning of the string or a space
    |           # or
      [_-]      # match '_' or '-'
    )           # end non-capture group
    [A-Za-z]    # match a letter
    [^ _-]*     # match 0+ characters other than ' ', '_' and '-'
    /x          # free-spacing regex definition mode
delimiters = Regexp.union(['-', '_'])
str.split(delimiters).then { |first, *rest| [first, rest.map(&:capitalize)].join }

#=> "myVarName"