【发布时间】:2010-04-28 15:25:12
【问题描述】:
如何使用 Ruby 获取字符串中的第一个字符?
我所做的最终是取某人的姓氏并从中创建一个首字母。
所以如果字符串是“Smith”,我只想要“S”。
【问题讨论】:
-
附带说明,如果你在 Rails 中,你可以这样做
'Smith'.first -
Ruby 1.9+ 有
"Smith".chr #=> "S"
如何使用 Ruby 获取字符串中的第一个字符?
我所做的最终是取某人的姓氏并从中创建一个首字母。
所以如果字符串是“Smith”,我只想要“S”。
【问题讨论】:
'Smith'.first
"Smith".chr #=> "S"
您可以使用 Ruby 的开放类使您的代码更具可读性。例如,这个:
class String
def initial
self[0,1]
end
end
将允许您对任何字符串使用initial 方法。所以如果你有以下变量:
last_name = "Smith"
first_name = "John"
那么你就可以非常清晰易读地获得缩写:
puts first_name.initial # prints J
puts last_name.initial # prints S
这里提到的另一种方法在 Ruby 1.8 上不起作用(不是说你应该再使用 1.8 了!--但是当这个答案发布时它仍然很常见):
puts 'Smith'[0] # prints 83
当然,如果你不是定期做,那么定义方法可能有点过头了,你可以直接做:
puts last_name[0,1]
【讨论】:
如果您使用的是最新版本的 Ruby(1.9.0 或更高版本),则应该可以使用以下方法:
'Smith'[0] # => 'S'
如果您使用 1.9.0+ 或 1.8.7,以下应该可以工作:
'Smith'.chars.first # => 'S'
如果您使用早于 1.8.7 的版本,这应该可以工作:
'Smith'.split(//).first # => 'S'
注意'Smith'[0,1] not 在 1.8 上工作,它不会 给你第一个字符,它只会给你第一个 byte em>。
【讨论】:
"Smith"[0] 将返回字符“S”的整数值。两个版本都服从"Smith"[0,1] == "S"。
"Smith"[0,1] 确实适用于 1.8(假设为 ASCII)。不知道为什么您对请求者以及想从该问题中学习的其他所有人做出如此多的假设。例如,Mac OS X 与 Ruby 1.8 捆绑在一起,因此这些用户无需安装。
"Smith"[0..0]
适用于 ruby 1.8 和 ruby 1.9。
【讨论】:
为了完整起见,因为 Ruby 1.9 String#chr 返回字符串的第一个字符。它在 2.0 和 2.1 中仍然可用。
"Smith".chr #=> "S"
【讨论】:
.first 不同,它不需要rails 来处理字符串。
在 MRI 1.8.7 或更高版本中:
'foobarbaz'.each_char.first
【讨论】:
试试这个:
>> a = "Smith"
>> a[0]
=> "S"
或
>> "Smith".chr
#=> "S"
【讨论】:
在 Rails 中
name = 'Smith'
name.first
【讨论】:
>> s = 'Smith'
=> "Smith"
>> s[0]
=> "S"
【讨论】:
"Smith"[0] 将返回字符“S”的整数值。两个版本都服从"Smith"[0,1] == "S"。
"Smith"[0] == ?S 在 Ruby 1.8 和 1.9 上都是正确的
另一个尚未提及的选项:
> "Smith".slice(0)
#=> "S"
【讨论】:
由于 Ruby 1.9 之前的一个恼人的设计选择——some_string[0] 返回第一个字符的字符代码——最便携的写法是some_string[0,1],它告诉它得到索引 0 处的子字符串,长度为 1 个字符。
【讨论】:
试试这个:
def word(string, num)
string = 'Smith'
string[0..(num-1)]
end
【讨论】:
其他方法是使用chars 作为字符串:
def abbrev_name
first_name.chars.first.capitalize + '.' + ' ' + last_name
end
【讨论】:
如果你使用Rails,你也可以使用truncate
> 'Smith'.truncate(1, omission: '')
#=> "S"
或其他格式:
> 'Smith'.truncate(4)
#=> "S..."
> 'Smith'.truncate(2, omission: '.')
#=> "S."
虽然这对于原始问题来说绝对是矫枉过正,但对于纯 ruby 解决方案,以下是 truncate 在 rails 中的实现方式
# File activesupport/lib/active_support/core_ext/string/filters.rb, line 66
def truncate(truncate_at, options = {})
return dup unless length > truncate_at
omission = options[:omission] || "..."
length_with_room_for_omission = truncate_at - omission.length
stop = if options[:separator]
rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
else
length_with_room_for_omission
end
"#{self[0, stop]}#{omission}"
end
【讨论】:
truncate 的 ruby 实现
以下任何一种方法都可以:
name = 'Smith'
puts name.[0..0] # => S
puts name.[0] # => S
puts name.[0,1] # => S
puts name.[0].chr # => S
【讨论】:
name之后可以使用.。最后一个即使你删除了.,也是毫无意义的,因为它使用两种不同的方法来做同样的事情——[0]和chr()。