我是Ruby的新手,想知道如何自动化一个空数组,以显示输入的数据按字母顺序排序,并在每个条目之间交替使用大写和小写。我在这个网站上看过类似的帖子,描述了如何实现这一目标,但似乎无法使其发挥作用。
以下是我的代码,这是使用此处的示例:How to have the user input alternate between uppercase and lowercase in Ruby?
目前我的代码首先交替使用大写和小写,然后按字母顺序对其进行排序(创建两个列表)。我想要的只是一个按字母顺序排列的列表,并交替大写和小写。我希望这是有道理的,谢谢你的时间!
puts "Welcome to the word list!"
words = []
5.times do
puts "Please enter a word:"
words << gets.chomp
end
words.each_with_index do |word, index|
if index.even?
puts word.upcase
else
puts word.downcase
end
end
puts "Here are your words:"
puts words.sort
答案 0 :(得分:2)
首先,在这两种情况下你会得到不同的结果:
1. sort the words first and then apply your alternate upcase/downcase logic.
2. apply your alternate upcase/downcase logic first, then sort the words.
因为如果先对单词进行排序,原始输入数组中单词的索引将会改变。因此,当您根据输入数组中单词的索引执行此操作时,它将对您的upcase / downcase逻辑产生影响。
因此,这取决于您的原始要求,您是要先对单词进行排序还是最后进行排序。
这是第一种方法:
puts "Welcome to the word list!"
words = []
results = []
5.times do
puts "Please enter a word:"
words << gets.chomp
end
words.sort.each_with_index do |word, index| # sort the input words first, then loop through
# accumulate the results in the results array
if index.even?
results << word.upcase
else
results << word.downcase
end
end
puts "Here are your resulting words: "
puts results
如果你想要第二个,你可以在最后进行排序。
答案 1 :(得分:2)
我会这样做:
enum = [:upcase, :downcase].cycle
#<Enumerator: [:upcase, :downcase]:cycle>
5.times.with_object([]) do |_,words|
puts "Please enter a word:"
words << gets.chomp.send(enum.next)
end
如果输入"dog\n"
,"cat\n"
,"pig\n"
,"cow\n"
和"owl\n"
,则会返回:
["DOG", "cat", "PIG", "cow", "OWL"]
当你是Ruby的新手时,如果你理解我在一读时所做的事情,我会感到惊讶。但是,如果你将其分解,那就不那么糟糕了。如果你在理解它之前就开始研究它,我保证你会大大改善你对语言的理解。
如果您检查Array#cycle(返回班级Enumerator
的实例)和Enumerator#next的文档,您会发现:
enum.next #=> :upcase
enum.next #=> :downcase
enum.next #=> :upcase
enum.next #=> :downcase
...
将方法分派给接收者是Object#send的工作。每当你调用一个方法(比如[1,2] << 3
)时,Ruby就会将方法(名称)及其参数发送给接收者({{1} })。
所以你看,方法名[1,2].send(:<<, 3
被发送给所有人
偶数字和:upcase
被发送到所有奇数字。
方法Enumerator#with_object是一种类似Ruby的方式来产生结果:
:downcase
请注意words = []
5.times do
puts "Please enter a word:"
words << gets.chomp.send(enum.next)
end
words
保存了两个步骤,但它还具有将数组with_object
的范围限制为块的优势。
可以使用相关方法Enumerable#each_with_object代替words
(因为课程each_object
Enumerator
是{{{当接收者不是枚举器时(例如,当接收器是数组或散列时),必须使用1}}模块)。
最后,您可以将块变量写为include
,其中Enumerable
是索引(由Integer#times生成),范围从|i,words|
到i
。通常的做法是使用下划线替换块中未使用的块变量,部分是为了通知读者。请注意,0
是完全合法的局部变量。