Coffeescript 类不返回函数的最后一个语句

Posted

技术标签:

【中文标题】Coffeescript 类不返回函数的最后一个语句【英文标题】:Coffeescript Classes not returning last statement of function 【发布时间】:2012-08-18 08:10:11 【问题描述】:

我一直在使用咖啡脚本类,据我所知,函数应该总是自动返回最后一条语句。但是,我发现构造函数对象中定义的函数默认情况下不返回任何内容。这是为什么呢?

咖啡脚本

constructor: ->
  @ # <~~ returned as expected

class MyClass
  constructor: ->
    @ # <~~ not returned - why?

class MyClass
  constructor: ->
    return ->
      @ # <~~ returned like normal!

javascript

var MyClass;

(
  constructor: function() 
    return this;
  
);

MyClass = (function() 

  function MyClass() 
    this;

  

  return MyClass;

)();

MyClass = (function() 

  function MyClass() 
    return function() 
      return this;
    ;
  

  return MyClass;

)();

【问题讨论】:

【参考方案1】:

当您在类上使用“new”关键字时会调用“constructor”方法 - 因此返回值始终应该是新实例,而不是您想要返回的其他值。但是,CoffeeScripts 似乎允许您通过“return”关键字强制使用不同的返回值。

class Foo
  constructor: -> 

f = new Foo
f instanceof Foo   # expected to be very true...

当您将普通函数命名为“构造函数”(不是方法 = 类定义之外)时,它不是构造函数而是普通函数,因此按预期返回。

【讨论】:

我想知道“显式返回”是 CoffeeScript 中的错误(即正常函数翻译的副作用)还是故意的。我可以看到有人添加了“在 ctor 中没有隐式返回”逻辑,但忽略了添加“在 ctor 中没有显式返回值”检查。至少 plain return; 做正确的事。 @muistooshort 好点。我发现的只是:github.com/jashkenas/coffee-script/issues/…【参考方案2】:

如果你想从一个“构造函数”方法返回一个不同的对象,你 需要创建工厂方法,因为 Coffeescript 和 Javascript 不需要 允许重载“new”操作符

 class A
   @create: (params)-> new A params
   constructor: (params)-> console.log params

 a = A.create "foo"

【讨论】:

以上是关于Coffeescript 类不返回函数的最后一个语句的主要内容,如果未能解决你的问题,请参考以下文章

CoffeeScript 返回函数内的函数

在 CoffeeScript 中获取数组的最后一个元素

Keras MultiHeadAttention() 类不返回预期值

使用 Coffeescript 设置 AngularJS 控制器属性不能是最后一行

类不包含构造函数错误

Coffeescript奇怪的行为[重复]