2

したがって、基本的には非常に似ている多くの関数がありますが、関数名がわずかに異なり、変数へのアクセスがわずかに異なります。

繰り返すのではなく、Ruby の define_method に似た方法でこれらのメソッドを作成したいと思います。

Ember.js オブジェクトでこれを行う方法を知っている人はいますか? ああ、できればCoffeeScript!

これは明らかに間違っていますが、非常に基本的な例にすぎません。

Thing = Ember.Object.extend()

animal = "cow"
say = "moo"

animal = "dog"
say = "woof"

Thing.reopenClass(
this["#{animal}Speak"]: ->
console.log say
)

誰でもこれを手伝ってもらえますか?

4

1 に答える 1

2

reopenClassオブジェクトが必要なだけなので、オブジェクトを構築してから渡すことができますreopenClass

add_this = { }
add_this["#{animal}Speak"] = -> console.log say
Thing.reopenClass add_this

残念ながら、オブジェクト リテラルのキーを作成するときに文字列補間を使用できないため、明らかです (ただし正しくありません)。

Thing.reopenClass(
    "#{animal}Speak": -> console.log say
)

構文エラーが発生します。

問題の根本は、補間を伴う文字列が文字列リテラルではなく、値が文字列である式であることにあると思います。オブジェクト リテラルのキーは、引用符で囲まれていない単純なラベル ( label:) または文字列リテラル ('string':または"string":) でなければなりません。あなたがこれを言うとき:

"string with #{interpolation}"

あなたは本当にこれの省略形を使用しています:

"string with " + interpolation

また、CoffeeScript コンパイラは、これを書き直すほど賢くありません。

o = { "string with #{interpolation}": value }

この JavaScript として:

o = { }
o['string with ' + interpolation] = value

そのため、CoffeeScript (または JavaScript) のオブジェクト リテラルのキーとして文字列値式を使用することはできません。

于 2012-11-01T21:42:42.797 に答える