我有两个课程List
和Task
:
class List
attr_reader :all_tasks
def initialize
@all_tasks = []
end
def add (task)
@all_tasks << task
end
def show
all_tasks
end
end
class Task
attr_reader :description
def initialize (description)
@description = description
end
end
以下代码:
breakfast = Task.new("Make Breakfast")
my_list = List.new
my_list.add(breakfast)
my_list.add(Task.new("Wash the dishes!"))
my_list.add("Send Birthday Gift to Mom")
puts "Your task list:"
puts my_list.show
输出:
Your task list:
#<Task:0x00007fd9e4849ed0>
#<Task:0x00007fd9e4849e30>
Send Birthday Gift to Mom
我希望能够将待办事项列表的任务显示为字符串,同时将Task
个实例作为数组中的对象。我该怎么做?
答案 0 :(得分:3)
考虑到问题中的代码,只需重新定义任务的方法to_s
即可。
class Task
attr_reader :description
def initialize (description)
@description = description
end
def to_s
"Task: #{description}"
end
end
Your task list:
Task: Make Breakfast
Task: Wash the dishes!
Send Birthday Gift to Mom
答案 1 :(得分:1)
您使用add
个实例致电Task
:
my_list.add(Task.new("Wash the dishes!"))
和String
个实例:
my_list.add("Send Birthday Gift to Mom")
在一个数组中混合使用Task
和String
实例会使其更难处理。除非你真的想要或需要这个,否则我会改变add
,所以它将字符串参数转换为Task
个实例:
class List
# ...
def add(task)
task = Task.new(task) unless task.is_a? Task
@all_tasks << task
end
end
is_a?
会检查task
是否(已经)Task
。如果不是,则将其作为参数传递给Task.new
,返回此类实例。这可确保@all_tasks
仅包含Task
个实例。
您当前的List#show
实现只返回all_tasks
,即数组。虽然puts
能够打印数组......
如果使用数组参数调用,则将每个元素写入新行。
...我会更改show
以返回格式化字符串:
class List
# ...
def show
all_tasks.map { |task| "[ ] #{task.description}" }.join("\n")
end
end
map
返回一个新数组,其中包含每个任务实例的字符串。每个字符串都包含相应的任务description
,前缀为[ ]
,它应该类似于一个小复选框。 join
然后使用"\n"
(换行符)作为分隔符连接这些字符串元素。
输出:
Your task list:
[ ] Make Breakfast
[ ] Wash the dishes!
[ ] Send Birthday Gift to Mom