私はcoffescript
を勉強しています。クラスのすべてのインスタンス化中にインスタンスメソッド(@generate_human
)を実行したいが、関数が存在しないというエラーが出る。代わりにメソッドをクラスメソッドに変更すると、すべてが機能します。何が起こっている?クラスレベルでインスタンスメソッドが機能しないのはなぜですか?
class Human # As biological creature
constructor: (@given_sex = null,
@age = null, # Age of the person
@max_age = 85) -> # Maximum allowed age of the person during person generation
_alive = true
alive: ->
@_alive
dead: ->
not @alive()
has_died: ->
@_alive = false
_available_sexes: {0: 'female', 1: 'male'}
sex: ->
_sex = @_available_sexes[@given_sex]
generate_human: ->
@_alive = true
if @age is null
@age = Math.floor(Math.random() * @max_age)
if @given_sex is null
@given_sex = Math.floor(Math.random() * 2)
else if @given_sex not in [0,1]
n = @given_sex
err = 'Invalid sex value: ' + n
console.log(err)
throw new Error(err)
@generate_human() # In JavaScript this line throws an error that function 'this.generate_human()' does not exist
h = new Human()
私の '@generate_human()'とあなたとの相違点は見当たりません。それらはどちらも 'コンストラクタ'の下で呼び出され、それを呼び出す唯一の合理的な場所です。私の意見では、問題はこのメソッドが定義されている場所です: '@generate_human()'が例外をスローするよりも自分のコードでコンストラクタの中で定義した場合です。私が 'コンストラクタ'の外で定義すると、呼び出しは成功し、なぜ私が最初に書いた方法で動作しないのか分かりません(私はコンストラクタでメソッドを定義し、すぐに呼び出します)。私のコードを変更して、 'generate_human: - >'コンストラクタ内で動作するようにしてください。 –
だから、実際にはすべてのものを 'コンストラクタ'の中に入れようとしていますか?私はインデントがcopy'n'pasteエラーであると仮定しました。構造体が意味をなさないため、クラスの一部になりたい場合は、コンストラクタの外にあるはずです。すべてが 'コンストラクター'の中にある場合、何もしません。オブジェクトリテラルを定義して完全に無視するのと同じです。 –