替代大写和小写红宝石

时间:2015-11-08 23:30:23

标签: ruby

我是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

2 个答案:

答案 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是完全合法的局部变量。