这段 Python 代码的等价物是什么:
class Player:
def __init__(self):
self.hp = 10
self.pos = [0,0,0]
self.items = []
def damage(self,dmg):
self.hp -= dmg
player = Player()
player.damage(3)
player.pos[0] += 5
player.items.append("banana")
print player.hp, player.pos, player.items
>> 3 [5,0,0] ["banana"]
在 Clojure(或其他 Lisp)中?
在普通 Lisp 中:
(defclass player ()
((hp :accessor hp :initform 10)
(pos :accessor pos :initform (list 0 0 0))
(items :accessor items :initform nil)))
(defmethod damage ((a-player player) damage)
(decf (hp a-player) damage))
在 REPL 中
; compiling (DEFCLASS PLAYER ...)
; compiling (DEFMETHOD DAMAGE ...)
CL-USER> (defparameter *player* (make-instance 'player))
*PLAYER*
CL-USER> (damage *player* 3)
7
CL-USER> (incf (car (pos *player*)) 5)
5
CL-USER> (push :banana (items *player*))
(:BANANA)
CL-USER> (list (hp *player*) (pos *player*) (items *player*))
(7 (5 0 0) (:BANANA))
CL-USER>
就我个人而言,我会将 pos
分成单独的 x
、y
和 z
,并且可能定义一些将东西放入和取出库存的方法,以防万一我决定稍后更改表示。