В вашем коде есть три проблемы:
- Вы вычисляете
symbol*number
, но ничего не делаете с результатом. Вы просто игнорируете это. Вы не храните его в переменной, не возвращаете его из блока, не распечатываете или что-либо еще.
- Вы сразу
breaking
из loop
, поэтому оно будет выполнено только один раз.
- Вы никогда ничего не печатаете.
Есть бесконечные способы решения этой проблемы, вот один:
#!/usr/bin/env ruby
def make_square(number = 3, symbol = '*')
return '' if number.zero?
symbol = symbol.dup.freeze
return symbol if number == 1
solid_line = (symbol * number)
middle_line = (symbol + ' ' * (number - 2) + symbol)
middle_lines = ([middle_line] * (number - 2))
return [
solid_line,
*middle_lines,
solid_line
].join("\n").freeze
end
def print_square(number = 3, symbol = '*')
puts make_square(number, symbol)
end
def ask_input
return ask_number, ask_symbol
end
def ask_number
puts 'Please enter a number'
read_number
end
def ask_symbol
puts 'Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)'
read_symbol
end
def read_number
Integer(gets).tap do |number|
raise ArgumentError, "`number` must be non-negative but is #{number}" if number.negative?
end
end
def read_symbol
gets.chomp.tap do |symbol|
raise ArgumentError, "`symbol` must be a single character" if symbol.size > 1
raise ArgumentError, "`symbol` must be printable and visible" unless /\p{Graph}/ =~ symbol
end.freeze
end
def main
number, symbol = ask_input
puts 'This is the square:'
puts
print_square(number, symbol)
end
main
# $ print_square.rb
# Please enter a number
# 0
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
#
#####
# $ print_square.rb
# Please enter a number
# 1
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
# █
#####
# $ print_square.rb
# Please enter a number
# 2
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
# ██
# ██
#####
# $ print_square.rb
# Please enter a number
# 3
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
# ███
# █ █
# ███
#####
# $ print_square.rb
# Please enter a number
# -1
# ./print_square.rb:41:in `block in read_number': `number` must be non-negative but is -1 (ArgumentError)
# from ./test.rb:40:in `tap'
# from ./test.rb:40:in `read_number'
# from ./test.rb:31:in `ask_number'
# from ./test.rb:26:in `ask_input'
# from ./test.rb:53:in `main'
# from ./test.rb:60:in `<main>'
#####
Это может выглядеть как перебор, но, разделив различные подзадачи, подзадачи и т. Д. На разные методы, мы можем легко протестировать каждую подзадачу в отдельности и отследить ошибку до определенной точки. в нашем коде. Например, если мы подозреваем, что в нашем методе чтения чисел есть ошибка, мы можем вызвать только один этот метод и проверить его результат, вместо того чтобы выполнять всю программу печати квадрата. И наоборот, если мы подозреваем, что в построении нашего квадрата есть ошибка, мы можем просто вызвать метод make_square
с разными аргументами без необходимости вводить символ и число снова и снова, например, как это:
8.times(&method(:print_square))
#
# *
# **
# **
# ***
# * *
# ***
# ****
# * *
# * *
# ****
# *****
# * *
# * *
# * *
# *****
# ******
# * *
# * *
# * *
# * *
# ******
# *******
# * *
# * *
# * *
# * *
# * *
# *******