【问题标题】:Coffeescript 1.7.1 unexpected newline weirdnessCoffeescript 1.7.1 意外的换行怪异
【发布时间】:2014-04-16 21:21:22
【问题描述】:

我有以下代码(大约一年前),用于在应用程序中处理邮政编码。今天我不得不改变一个值,现在突然我不能再编译它了。我在“hilleroed”的“h”处意外换行。

class Application
    postal_codes:
        regions:
            sjaelland:[0..4999]
            fyn: [5000..5999]
            soenderjylland: [6000..6200]
                .concat [6261..6280]
                .concat [6600..6899]
                .concat [6041..6064]
                .concat [6960]
                .concat [7000..7079]
                .concat [7200]
                .concat [7250]
            nordmidtjylland: [6900..6999]
                .concat [7080..7199]
                .concat [7182..7184]
                .concat [7190..7190]
                .concat [7260..9999]

        office_postal:
            ringsted: 4100
            hilleroed: 3400
            kgslyngby: 2800
            odense: 5220
            haderslev: 6100
            esbjerg: 6715
            herning: 7400
            aalborg: 9200
            aarhus: 8210
            horsens: 8700

        offices:
            ringsted: [0..2690]
                .concat [2770,2791]
                .concat [4000..4030]
                .concat [4050..4990]

            hilleroed: [2700..2765]
                .concat [2980..3670]
                .concat [4040]

            kgslyngby: [2800..2970]

            odense: [5000..5985]

            haderslev: [6000..6240]
                .concat [6300..6622]
                .concat [6630..6640]
                .concat [7000..7080]
                .concat [7182..7184]

            esbjerg: [6261..6280]
                .concat [6623]
                .concat [6650..6879] # 6880 is herning.. meh
                .concat [6881..6893]
                .concat [6960]
                .concat [7200..7260]

            herning: [6880]
                .concat [6900..6950]
                .concat [6971..6990]
                .concat [7270..7280]
                .concat [7330..7680]
                .concat [7800..7884]
                .concat [8800]
                .concat [8831]

            aalborg: [7700..7790]
                .concat [7900..7990]
                .concat [8832]
                .concat [8970]
                .concat [9000..9999]

            aarhus: [8000..8270]
                .concat [8305..8340]
                .concat [8355..8643]
                .concat [8660..8670]
                .concat [8830]
                .concat [8840..8963]
                .concat [8981..8990]

            horsens: [7100..7173]
                .concat [7190]
                .concat [7300..7323]
                .concat [8300,8350]
                .concat [8653..8659]
                .concat [8680..8783]

我终其一生都无法弄清楚出了什么问题。这是一个错误还是我错过了什么?如果我将代码粘贴到 coffeescript.org 上的在线编译器中,我会得到同样的错误。如何解决?

编辑:

我正在使用咖啡脚本 1.7.1。它适用于 1.6.3。

更新:

这是一个意外错误,请参阅https://github.com/jashkenas/coffee-script/issues/3408

【问题讨论】:

  • 也许您的编辑器切换了换行符方案,或者插入了制表符而不是空格。恢复并重试,并确保没有发生这种情况。
  • 复制粘贴在此处并可能已被格式化程序清理的内容时很难诊断。您的编辑器是否允许您查看空白字符/行尾?
  • 试过了,没有雪茄。如果是这样,它也会更早地失败。
  • 如果您只是将此处发布的内容复制粘贴到coffeescript.org 的“try coffeescript”中,您会得到同样的错误。
  • 你说得对,看起来 plnkr 使用的是 Coffee 1.6.3。

标签: coffeescript


【解决方案1】:

问题出在 office 对象中。此代码失败:

offices:                           
  ringsted: [0..2690]              
    .concat [2770, 2791]           
    .concat [4000..4030]           
    .concat [4050..4990]           
  hilleroed: [2700..2765]          
    .concat [2980..3670]           
    .concat [4040]                 
  kgslyngby: [2800..2970]         

虽然通过了:

offices:                                                                           
  ringsted: [0..2690].concat [2770, 2791].concat [4000..4030].concat [4050..4990]  
  hilleroed: [2700..2765].concat [2980..3670].concat [4040]                        
  kgslyngby: [2800..2970] 

如果你真的想保留换行符,添加一些括号:

offices:                          
  ringsted: ([0..2690]            
    .concat [2770..2791]          
    .concat [4000..4030]          
    .concat [4050..4990])         
  hilleroed: ([2700..2765]        
    .concat [2980..3670]          
    .concat [4040])               
  kgslyngby: [2800..2970]       

编译器似乎对对象定义的结束位置感到困惑。如果你省略括号,你会得到这个js:

// without parens

var _i, _j, _k, _l, _results, _results1, _results2, _results3;

({
  offices: {
    ringsted: (function() {
      _results3 = [];
      for (_l = 0; _l <= 233; _l++){ _results3.push(_l); }
      return _results3;
    }).apply(this)
  }.concat((function() {
    _results2 = [];
    for (_k = 2770; _k <= 2791; _k++){ _results2.push(_k); }
    return _results2;
  }).apply(this)).concat((function() {
    _results1 = [];
    for (_j = 4000; _j <= 4030; _j++){ _results1.push(_j); }
    return _results1;
  }).apply(this)).concat((function() {
    _results = [];
    for (_i = 4050; _i <= 4990; _i++){ _results.push(_i); }
    return _results;
  }).apply(this))
});

在节点 repl 中运行时,返回:

TypeError: Object #&lt;Object&gt; has no method 'concat'

这是有道理的,基于 js,但没有意义基于咖啡。这可能值得submitting as an issue

TLDR:当您希望将函数返回值分配给对象的字段时,请使用括号。

【讨论】:

  • plnkr 必须使用旧版本的咖啡脚本。如果我将示例中的代码复制粘贴到 coffeescript.org 上的编辑器中,我会收到错误消息。
  • 你试过用咖啡绒做 sublime lint 吗?它最常发现这样的错误。
  • 我刚尝试用 1.6.3 编译,它可以工作。看起来这可能是 1.7.1 中的一个错误。
  • @Fresheyeball 我几乎每天都使用咖啡脚本大约 2 年。到目前为止,我还没有用过 linter。我会试一试,但它开始看起来像 1.7.1 中的错误。
  • This one 有效,this one 有效,this one 失败。这些都是coffeescript.org链接的缩短版本顺便说一句,非缩短版本太大而无法发表评论。希望第三种情况有助于将问题范围缩小到任何想要提交错误报告的人。
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2013-04-16
  • 1970-01-01
  • 2015-07-26
相关资源
最近更新 更多