2017-09-18 8 views
0

Paul Heggartyが作成したスウィフト電卓をこのCS193p(Stanford、Winter 2017)のTypescriptコード(この場合はIonic 3(Angular 4))に変換しようとしています。 。Typescript/Javascriptのスウィフトクロージャ

私は可能な限り同じようにすることに焦点を当てていません。

私はかなり遠くに来ましたが、私はタイプスクリプトで次のことをするのに苦労しています。

private var operations: Dictionary<String,Operation> = [ 
     "+" : Operation.binaryOperation({ $0 + $1 }), 
     "−" : Operation.binaryOperation({ $0 - $1 }), 
     "÷" : Operation.binaryOperation({ $0/$1 }), 
     "×" : Operation.binaryOperation({ $0 * $1 }), 
     "π" : Operation.constant(Double.pi), 
     "√" : Operation.preFixUnaryOperation(sqrt), 
     "x²" : Operation.postFixUnaryOperation({ pow($0, 2) }), 
     "x³" : Operation.postFixUnaryOperation({ pow($0, 3) }), 
     "=" : Operation.equals, 
     "±" : Operation.preFixUnaryOperation({ -$0 }), 
     "sin": Operation.preFixUnaryOperation(sin), 
     "cos": Operation.preFixUnaryOperation(cos), 
     "tan": Operation.preFixUnaryOperation(tan), 
     "e" : Operation.constant(M_E) 
    ] 

これまでの説明では、「{}」型の「操作」というプライベート変数を作成していました。

その後呼び出すことで、それを "埋める":

this.operations['+' = Operation.binaryOperation(() => {arguments[0] + argumenst[1]}) 

充填部分が作業を行います。私はこのような関数をどのように解析するのか分かりません。スウィフトで

列挙操作:活字体で

private enum Operation { 
    case constant(Double) 
    case preFixUnaryOperation((Double) -> Double) 
    case postFixUnaryOperation((Double) -> Double) 
    case binaryOperation((Double,Double) -> Double) 
    case equals 
} 

列挙操作(同じ問題):

export enum Operation { 
    constant, // Double is an assosiative value, its like the assosiated value in the 'set' state of an optional. 
    preFixUnaryOperation, 
    postFixUnaryOperation, 
    binaryOperation, 
    equals 
} 

どのように使用する必要があり、スウィフト、 "閉鎖" で呼び出され、typescriptですで/ javascript?

答えて

1

あなたの質問は約Associated Valuesで、Closuresではないと思います。

活字体は、関連する値のない完全なアナログを持っていますが、あなたがそのような何かを行うことができます。

const enum Operation { 
    preFixUnaryOperation, 
    postFixUnaryOperation, 
    binaryOperation 
} 

type IOperation = { 
    type: Operation.preFixUnaryOperation | Operation.postFixUnaryOperation; 
    func: (a: number) => number; 
} | { 
    type: Operation.binaryOperation; 
    func: (a: number, b: number) => number; 
} 

let operations: {[key: string]: IOperation} = { 
    '+': { type: Operation.binaryOperation, func: (a, b) => a + b }, 
    'x²': { type: Operation.postFixUnaryOperation, func: (a) => a * a } 
}; 

let operation = operations[someKey]; 

switch (operation.type) { 
    case Operation.binaryOperation: 
    return operation.func(left, right); 
    case Operation.preFixUnaryOperation: 
    return operation.func(right);  
    case Operation.postFixUnaryOperation: 
    return operation.func(left); 
} 

も参照してください:Discriminated Unions

関連する問題