Ruby由于未知的特征而冻结

时间:2014-03-06 16:40:39

标签: ruby

我遇到了一个奇怪的问题,想知道为什么会这样,以及下次出现时如何避免它。我是Ruby的新手。

我目前正在开发使用Active Admin的Rails应用程序。我的一个索引操作如下所示:

index do
    selectable_column
    column ('Order') { |p| p.order.number }
    column ('Amount') { |p| p.amount }
    column('Paid at') { |p|p.paid_at }
    # column ('Response code') { |p| p.response_code }
    # column ('merchant code') { |p| p.merchant_code }
    default_actions
end

这很有效,但是如果我取消注释las两行并重新加载页面,则应用程序在渲染视图时会冻结。没有日志,没有什么。 ruby进程不断增加其内存使用量,我被迫杀死它。

我使用Sublime Text 2作为我的编辑器和Ruby 2.1.1p76。

奇怪的是,从导致问题的行中删除所有空格字符似乎可以修复它。我还可以再次添加空格字符(使用空格键)。这让我觉得它与Sublime以某种方式放置的怪异角色(控制角色等)有关。

当Ruby发现某些特殊字符时,它是否可能会冻结?这是在某处记录的吗?我该如何调试这些问题?

由于

修改

通过显示Sublime Text中的空格,如果发现有问题的字符('| p |'和'p.response_code'之间的空格不是空白字符)。 无论如何,我很想知道为什么Ruby会因为这个角色而冻结,以及这种“空间”是如何出现的。

1 个答案:

答案 0 :(得分:1)

不可见的字符和解析/标记

解析器必须能够正确地对您的代码进行标记,然后才能正常工作。在Ruby中,可以使用Ripper类检查标记化和解析。

从解析器的角度来看,以下两个表达式并不相同:

{ |p| p.merchant_code }
{ |p|_p.merchant_code }

作为一个独立的示例,请考虑REPL的以下输出:

[2] pry(main)> [1,2].each { |p|_puts p }
NoMethodError: undefined method `_puts' for main:Object
from (pry):2:in `block in __pry__'

一种可能的解决方案

由编辑器或其他人的编辑器创建的不可见字符提交对公共代码库的更改,肯定会导致这些类型的问题。您可能希望在代码库中搜索UTF-8或UTF-16字符或其他意外字符集,以查看源代码中是否存在某种编码问题。