我正在试用'电子表格'宝石并注意到之前没有遇到的事情:
book = Spreadsheet.open "public/tickers.xls"
# => #<Spreadsheet::Excel::Workbook:0x5c16420>
puts book.worksheet(0)
# => #Spreadsheet::Excel::Worksheet:0x000000019494a8
book.worksheet(0)
# => This command hangs for a long time.
第二个和第三个命令之间的区别只是puts
语句。如何改变命令的效果立即返回而不是挂起?
答案 0 :(得分:3)
无论调用book.worksheet(0)
的结果如何,它都具有非常高效的to_s
和效率非常低的inspect
方法。这是一种可能性。
Worksheet#inspect
遍历所有实例变量并连接它们的字符串表示,因此如果它具有大量的实例变量,或者其中一个实例变量指向具有巨大字符串表示的对象(或者一个非常慢的to_s
)方法,需要很长时间。
OTOH,Worksheet
没有to_s
方法,所以它继承了Object
中的那个,这是非常快的,因为它只打印内存地址和类。