当前位置:  开发笔记 > 后端 > 正文

将首字母大写在红宝石中

如何解决《将首字母大写在红宝石中》经验,为你挑选了4个好方法。

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

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

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

我该怎么做?



1> Alberto Sant..:

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

Ruby 2.4及更高版本

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

"?????".capitalize #=> ?????

Ruby 2.3及更低版本

"maria".capitalize #=> "Maria"
"?????".capitalize #=> ?????

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

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

"?????".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte

做的工作.

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

require 'unicode'

Unicode::capitalize("?????") #=> ?????

Ruby 1.8

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

#!/usr/bin/env ruby

puts "?????".capitalize

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

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

puts "?????".capitalize

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


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

2> boulder_ruby..:

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

"kirk douglas".capitalize
#=> "Kirk douglas"

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

在铁轨中:

"kirk douglas".titleize
=> "Kirk Douglas"

要么

"kirk_douglas".titleize
=> "Kirk Douglas"    

在红宝石中:

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

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

require 'active_support/core_ext'
"kirk douglas".titleize #or capitalize


请注意,`capitalize`仅适用于ASCII字符.

3> Jörg W Mitta..:

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

这就是为什么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对大写和小写之间转换的处理被打破了,就是这样.
-1因为有一个大写[Eszett](https://en.wikipedia.org/wiki/Capital_%E1%BA%9E).使用一些非完全形式化的区域不能作为仅使用AI的解决方案的证据.

4> Huliax..:

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

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

 => ["NASA", "MHz", "Sputnik"]

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


`word [0] = word [0] .upcase`
推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有