问题非常简单,可能有数千个答案,但我正在寻找一些神奇的红宝石功能。
问题:
To determine whether a letter is upcase or not i.e belongs to A-Z.
可能的解决方案:
array = ["A","B", ....., "Z"]
letter = "A"
is_upcase = array.include? letter
请注意,“1”不是大写字母。
是否有任何神奇的ruby函数可以用较少的代码解决问题?
答案 0 :(得分:5)
您可以使用POSIX character classes:
/[[:lower:]]/
- 小写字母字符/[[:upper:]]/
- 大写字母示例:
def which_case(letter)
case letter
when /[[:upper:]]/ then puts 'uppercase'
when /[[:lower:]]/ then puts 'lowercase'
else puts 'other'
end
end
which_case('a') #=> lowercase
which_case('ä') #=> lowercase
which_case('A') #=> uppercase
which_case('Ä') #=> uppercase
which_case('1') #=> other
或者使用简单的if
声明:
puts 'lowercase' if /[[:lower:]]/ =~ 'a'
#=> lowercase
答案 1 :(得分:2)
使用===
?> ('A'..'Z') === 'C'
=> true
>> ('A'..'Z') === 'c'
=> false
>> ('A'..'Z') === '1'
=> false
>> ('A'..'Z') === '&'
=> false
>> ('A'..'Z') === 'Z'
=> true
答案 2 :(得分:2)
'A' =~ /[A-Z]/ #=> 0 (boolean true)
'a' =~ /[A-Z]/ #=> nil (boolean false)
答案 3 :(得分:2)
也缺乏对变音符号,diacritcs等的支持,并且需要ActiveSupport
,但我喜欢语法:
'A'.in?('A'..'Z') # => true
'a'.in?('A'..'Z') # => false
答案 4 :(得分:1)
def is_upcase? x
('A'..'Z').cover? x
end
编辑:.cover?
是1.9中的一个新功能,它通过仅检查端点来检查值是否在范围内。通过这种方式,计算机不需要将其转换为数组并将其存储在内存中,从而使其更快。
这基本上是写x >= 'A' && x <= 'Z'
答案 5 :(得分:1)
x&gt; ='A'&amp;&amp; x&lt; ='Z'