12

CoffeeScript (または純粋な JavaScript) で独自の中置関数/演算子を定義することは可能ですか? 例:電話したい

a foo b

また

a `foo` b

それ以外の

a.foo b

または、foo がグローバル関数の場合、

foo a, b

これを行う方法はありますか?

4

5 に答える 5

6

実際にこれを答えとして追加する:いいえ、これは不可能です。

バニラ JS では不可能です。

CoffeeScript では不可能です。

于 2012-09-10T11:46:30.433 に答える
2

これは間違いなく中置記法ではありませんが、ちょっと似ています: /

let plus = function(a,b){return a+b};

let a = 3;
let b = 5;
let c = a._(plus).b // 8

この「表記法」はかなり醜いので、誰も実際に使用したくないと思いますが、見た目を変えたり、見栄えを良くしたりするために微調整を加えることができると思います(おそらく、ここでこの回答を使用して「関数を呼び出す」 " かっこなし)。

中置関数

// Add to prototype so that it's always there for you
Object.prototype._ = function(binaryOperator){

  // The first operand is captured in the this keyword
  let operand1 = this; 

  // Use a proxy to capture the second operand with "get"
  // Note that the first operand and the applied function
  //   are stored in the get function's closure, since operand2
  //   is just a string, for eval(operand2) to be in scope,
  //   the value for operand2 must be defined globally
  return new Proxy({},{
    get: function(obj, operand2){
        return binaryOperator(operand1, eval(operand2))
    }
  })
}

また、2 番目のオペランドが文字列として渡され、 で評価されevalてその値が取得されることにも注意してください。このため、オペランドの値(別名「b」)がグローバルに定義されていない場合はいつでもコードが壊れると思います。

于 2016-09-19T04:08:56.903 に答える