将首字母大写在红宝石中

Ant*_*nAL 124 ruby

upcase方法将整个字符串大写.

我只需要把第一个字母大写.

另外,我需要支持几种流行语言,如德语和俄语.

我该怎么做?

Alb*_*ini 250

这取决于您使用的Ruby版本.

Ruby 2.4及更高版本

它只是工作,因为此版本 ruby支持Unicode案例映射.

"?????".capitalize #=> ?????
Run Code Online (Sandbox Code Playgroud)

Ruby 2.3及更低版本

"maria".capitalize #=> "Maria"
"?????".capitalize #=> ?????
Run Code Online (Sandbox Code Playgroud)

问题是,它只是没有做你想要的:它输出?????而不是?????.

如果您正在使用Rails,则可以轻松解决此问题:

"?????".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte
Run Code Online (Sandbox Code Playgroud)

做的工作.

否则,您将必须安装unicode gem并像这样使用它:

require 'unicode'

Unicode::capitalize("?????") #=> ?????
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8

首先,一定要使用编码魔术评论:

#!/usr/bin/env ruby

puts "?????".capitalize
Run Code Online (Sandbox Code Playgroud)

给出invalid multibyte char (US-ASCII),同时:

#!/usr/bin/env ruby
#coding: utf-8

puts "?????".capitalize
Run Code Online (Sandbox Code Playgroud)

工作没有错误,但也看到Ruby 2.3和更低的部分真正的大写.

  • 请注意,显然"我的API很棒".capitalize`会产生"我的api很棒",这可能是不受欢迎的行为.因此,这个答案并没有真正回答这个问题,因为他只希望第一封信变成大写,而其他人则没有动过. (13认同)

bou*_*uby 52

大写字母第一个单词的第一个字母

"kirk douglas".capitalize
#=> "Kirk douglas"
Run Code Online (Sandbox Code Playgroud)

大写每个单词的第一个字母

在铁轨中:

"kirk douglas".titleize
=> "Kirk Douglas"
Run Code Online (Sandbox Code Playgroud)

要么

"kirk_douglas".titleize
=> "Kirk Douglas"    
Run Code Online (Sandbox Code Playgroud)

在红宝石中:

"kirk douglas".split(/ |\_|\-/).map(&:capitalize).join(" ") 
#=> "Kirk Douglas"
Run Code Online (Sandbox Code Playgroud)

在rails之外,但仍想使用titleize方法

require 'active_support/core_ext'
"kirk douglas".titleize #or capitalize
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`capitalize`仅适用于ASCII字符. (2认同)
  • 为纯 Ruby 解决方案点赞。懒得正确启动 Rails,这确实成功了 :) (2认同)

Jör*_*tag 18

不幸的是,机器不可能正确地升级/缩小/大写.它需要太多的上下文信息才能让计算机理解.

这就是为什么Ruby的String类只支持ASCII字符的大写,因为它至少有一定的定义.

"上下文信息"是什么意思?

例如,要i正确地进行大写,您需要知道文本所使用的语言.例如,英语只有两个i:大写I没有点,小i点有点.但土耳其有四个i:资本I没有点,资本?有点,小?点没有点,小i点有点.所以,用英语'i'.upcase # => 'I'和土耳其语'i'.upcase # => '?'.换句话说:因为'i'.upcase根据语言可以返回两个不同的结果,显然不可能在不知道其语言的情况下正确地将单词大写.

但Ruby不知道语言,它只知道编码.因此,使用Ruby的内置功能无法正确地利用字符串.

更糟糕:即使知道的语言,有时不能正确地做资本.例如,在德语中,'Maße'.upcase # => 'MASSE'(MaßeMaß意义测量的复数).但是,'Masse'.upcase # => 'MASSE'(意思是质量).那么,是什么'MASSE'.capitalize?换句话说:正确的资本化需要一个完整的人工智能.

所以,与其有时还会提供错误的答案,红宝石选择有时给没有答案可言,这就是为什么非ASCII字符简单地获得downcase/upcase /资本运作忽略.(当然这也会读取错误的结果,但至少它很容易检查.)

  • 对不起,但你的论证并不成立.Ruby选择不给出答案是不正确的,Ruby总是给出答案,这通常是错误的 - 例如"мария".upcase应该永远不会返回"мария",这在任何情况下都是不正确的.你对人工智能需求的深入研究根本不相关 - 没有任何东西可以防止对数组进行重复操作,比如说''我','''为'i'.upcase,并让调用者决定哪个大写相关在特定情况下.目前,Ruby对大写和小写之间转换的处理被打破了,就是这样. (4认同)
  • -1因为有一个大写[Eszett](https://en.wikipedia.org/wiki/Capital_%E1%BA%9E).使用一些非完全形式化的区域不能作为仅使用AI的解决方案的证据. (2认同)

use*_*240 15

导轨 5+

从 Active Support 和 Rails 5.0.0.beta4 开始,您可以使用以下两种方法之一:String#upcase_firstActiveSupport::Inflector#upcase_first.

"my API is great".upcase_first #=> "My API is great"
"?????".upcase_first           #=> "?????"
"?????".upcase_first           #=> "?????"
"NASA".upcase_first            #=> "NASA"
"MHz".upcase_first             #=> "MHz"
"sputnik".upcase_first         #=> "Sputnik"
Run Code Online (Sandbox Code Playgroud)

查看“ Rails 5:新的 upcase_first 方法”了解更多信息。


Hul*_*iax 14

好吧,就这样我们知道如何只把第一个字母大写,剩下的就剩下了(因为有时这就是所希望的)......

['NASA', 'MHz', 'sputnik'].collect do |word|
  letters = word.split('')
  letters.first.upcase!
  letters.join
end

 => ["NASA", "MHz", "Sputnik"]
Run Code Online (Sandbox Code Playgroud)

调用#capitalize会导致 ["Nasa", "Mhz", "Sputnik"]

  • `word [0] = word [0] .upcase` (2认同)

jhw*_*ist 6

使用capitalize。来自字符串文档:

返回 str 的副本,其中第一个字符转换为大写,其余字符转换为小写。

"hello".capitalize    #=> "Hello"
"HELLO".capitalize    #=> "Hello"
"123ABC".capitalize   #=> "123abc"
Run Code Online (Sandbox Code Playgroud)

  • -1。OP *明确*提到了德语和俄语文本,这意味着非 ASCII 字符。`String#upcase` (以及 `String#downcase`)仅针对 ASCII 字符定义。 (5认同)
  • 现在使用 Ruby 2.5.0 和 `String#upcase` 似乎可以很好地处理非 ASCII 字符。`2.5.0 :001 > "мария".upcase => "МАРИЯ"` (2认同)