0

次の CoffeeScript コードを Javascript にコンパイルしようとしています。

GetCard = ->
  do Math.floor do Math.random * 12

Results = ->
  do NewGame if prompt "You ended with a total card value of #{UserHand}. Would you like to play again?"
  else
    alert "Exiting..."

NewGame = ->
  UserHand = 0
  do UserTurn

UserTurn = ->
  while UserHand < 21
    if prompt "Would you like to draw a new card?" is "yes"
      CardDrawn = do GetCard
      UserHand += CardDrawn
      alert "You drew a #{CardDrawn} and now have a total card value of #{UserHand}."
    else
      do Results
      break

しかし、yes と答えた場合、結果の Javascript は次のエラーをコンソールに出力します。

Uncaught TypeError: number is not a function BlackJack.js:4
GetCard BlackJack.js:4
UserTurn BlackJack.js:22
NewGame BlackJack.js:14
onclick

また、CoffeeScript は何らかの理由でUserHand0に設定していません。私はJavascriptにかなり慣れておらず、CoffeeScriptにも非常に慣れていません。私はCoffeeScriptのドキュメントとCoffeeScriptクックブックを検索して読みました.CSコードは正しいように見えますが、JSはそうではありません:

var GetCard, NewGame, Results, UserTurn;

GetCard = function() {
  return Math.floor(Math.random() * 12)();
};

Results = function() {
  return NewGame(prompt("You ended with a total card value of " + UserHand + ". Would you like to play again?") ? void 0 : alert("Exiting..."))();
};

NewGame = function() {
  var UserHand;
  UserHand = 0;
  return UserTurn();
};

UserTurn = function() {
  var CardDrawn, _results;
  _results = [];
  while (UserHand < 21) {
    if (prompt("Would you like to draw a new card?") === "yes") {
      CardDrawn = GetCard();
      UserHand += CardDrawn;
      _results.push(alert("You drew a " + CardDrawn + " and now have a total card value of " + UserHand + "."));
    } else {
      Results();
      break;
    }
  }
  return _results;
};

どんな助けでも大歓迎です。ありがとう!

更新: すべての回答に感謝します。二重括弧について少し混乱し、do キーワードを誤って使用して、関数呼び出し括弧の代わりにパラメーター括弧を置き換えました。ただし、グローバルスコープについてはまだ混乱しています。プレーンな JS で var キーワードを使用できることは知っていますが、CoffeeScript のドキュメントでは、スコープを管理するため、使用する必要はないと指定されていますか?

4

2 に答える 2

1

少し読んだ後、最初の問題はdoオペレーターにあるようです。私が知る限り、ループ内にクロージャーを作成して現在の値を関数にバインドするためのものです。ここで必要なものではありません。

単純に何か問題があるとは思いません:

GetCard = ->
    Math.floor( Math.random() * 12 )

2 番目の問題は、スコープの 1 つです。UserHandは にローカルNewGameであるため、 ではアクセスできませんUserTurn(undefinedそこにあります)。グローバルにするか、パラメーターとして渡すことができますがNewGame、とにかく結果だけが必要なように見えます:

NewGame = ->
    hand = UserTurn() // set hand to whatever the UserHand is from UserTurn

UserTurn = ->
    UserHand = 0
    while UserHand < 21
        if prompt "Would you like to draw a new card?" is "yes"
        (etc)
    UserHand // return the final UserHand value after the loop

また、いくつかの名前を再考することをお勧めします。少し混乱するものもあります。そして、多くの良い点でそれを分割しましたが、いくつかの奇妙な選択がまだあります (たとえば、21 を超えるとUserTurn、別の関数で処理されるのに処理を停止するのはなぜですか?)

于 2013-08-25T02:19:40.793 に答える
0
GetCard = ->
  Math.floor(Math.random() * 12)

引数なしで呼び出し たいことを明確にするために、そこに括弧が必要です。Math.randomそれ以外の場合、 afunctionName somethingは「最初の引数として何かを指定して functionName を呼び出す」ことを意味します。

一般に、関数呼び出しの括弧は、明らかな場合にのみ省略します。そうしないと、可読性を妨げるあいまいなものになります。

わかった:

someFunc 1, 2, 3

不明:

someFunc someOtherFunc someArg

(さておき…)

doキーワードを見直す必要があります。それは非常に特定の目的にのみ有用であり、ほとんどすべての使用は不必要/間違っています.

于 2013-08-25T02:21:42.060 に答える