2016-03-13 111 views
1

我想出来的“电子表格”宝石和发现了一些我以前没有遇到过:'puts'如何停止挂起命令?

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声明。这会如何改变命令立即返回而不是挂起的效果?

回答

3

无论调用book.worksheet(0)的结果是什么,它都有非常高效的to_s和非常低效的方法。这是一种可能性。

Worksheet#inspect循环遍历所有实例变量并连接它们的字符串表示形式,因此如果它要么具有大量的实例变量,要么其中一个实例变量指向具有巨大字符串表示形式的对象(或者非常慢to_s)的方法,这将需要很长时间。

OTOH,Worksheet没有to_s方法,所以它继承了Object这个方法,因为它只打印内存地址和类,所以速度非常快。