如何“放置”停止悬挂命令?

时间:2016-03-13 01:22:59

标签: ruby

我正在试用'电子表格'宝石并注意到之前没有遇到的事情:

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

1 个答案:

答案 0 :(得分:3)

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

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

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