遵照马大神指导，部分语句改用helper functions