如何在Ruby中将对象的属性显示为字符串

时间:2017-10-17 07:01:17

标签: ruby

我有两个课程ListTask

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个实例作为数组中的对象。我该怎么做?

2 个答案:

答案 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")

在一个数组中混合使用TaskString实例会使其更难处理。除非你真的想要或需要这个,否则我会改变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