用大写和小写交替打​​印多个单词

时间:2015-07-13 22:24:35

标签: ruby

我无法运行我的代码。

我想写下50个单词,但偶数单词[0,2,4,6,8,...]全部为大写,奇数单词为小写。

还有哪些其他编写代码的方法?我应该开始一个新阵列并拥有index = []吗?

words = []

50.times do
   puts "Please enter a word:" 
   words << gets.chomp
end

puts "These are your wonderful words. You are smart. Keep it up."

%w(words).each_with_index {|word, index|}
if index = word.even?
        puts word.upcase
if index = word.odd?
        puts word.downcase

end

3 个答案:

答案 0 :(得分:1)

您无法使用%w(words)

words # => ["a", "b"]
%w(words) # => ["words"]

%w(...)将每个以空格分隔的字符串转换为数组中单独的String元素:

%w(a 1) # => ["a", "1"]

您不能以这种方式将words变量插入到数组中。没有理由,因为你已经在words数组中已经有一个String元素数组,因为你已经说过它是一个使用的数组:

words = []

words << gets.chomp

这不是好代码:

if index = word.even?
        puts word.upcase
if index = word.odd?
        puts word.downcase

您无法使用=测试相等性。相反,这是分配。 Ruby不是解释BASIC:

a = 1 # => 1
a == 2 # => false

你不能word.even?word.odd?,因为单词不是偶数或奇数,只有整数。

1.even? # => false
1.odd? # => true
'foo'.even? # => 

# ~> -:3:in `<main>': undefined method `even?' for "foo":String (NoMethodError)

此外,您需要使用结束end语句。

更正了如下:

if index.even?
  puts word.upcase
end
if index.odd?
  puts word.downcase
end

但这可以写得更简洁明了:

folded_word = if index.even?
                word.upcase
              else
                word.downcase
              end

puts folded_word

答案 1 :(得分:0)

这里有几件事。

您在=语句中使用if将它们设置为相等。您需要使用==来测试相等性,而一个=设置相等性。如果您使用两个end语句,那么您还错过了if,因此请使用if / else

word = ["letter","booyah","sorry"]

word.each_with_index do |value, index|
    if index % 2 == 0  #(this is a modulo, when no remainder it is even)
          puts value.upcase
    else 
          puts value.downcase

    end
end

结果是:

LETTER
booyah
SORRY

此外,除非您先在chomp数组中添加某些内容,否则无法定义word方法。

答案 2 :(得分:0)

您可以使用Enumerable#each_slice

words.each_slice(2){|w| p w[0].downcase; p w[1].upcase}

但它需要偶数个单词。