在ruby方法中使用问号

rub*_*796 5 ruby methods syntax

假设我有课Player,我想要一个布尔方法来检查玩家是否受到攻击:

class Player
  attr_accessor :name, :health, :attacked?

  def initialize(name)
    @name = name
    @health = 100
    @attacked? = false
  end
end
Run Code Online (Sandbox Code Playgroud)

我收到语法错误:

SyntaxError: (irb):14: syntax error, unexpected '='
@attacked? = false
            ^
        from /usr/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

删除问号attacked可解决问题,但我认为最好遵循惯例来处理attacked?我的代码.这不是什么大不了的事放弃了问号,但为什么zero?nil?习惯时@variables?def methods?=无效?

mat*_*att 12

请注意,如果您注释掉导致错误的行(@attacked? = false),您仍会收到与问号相关的错误:

NameError: invalid attribute name `attacked?'
Run Code Online (Sandbox Code Playgroud)

问题是它?不是变量名中的有效字符.第一个错误(SyntaxError您所看到的)是在解析时引起的并立即捕获.当Ruby尝试评估代码并且无法创建名称包含无效字符的实例变量时,会导致第二个错误.

问号在年底的有效字符的方法名称虽然(实际上它可能有一个方法?在其名称中的任何地方,但你不能直接调用该方法).

实现你想要的东西的一种方法是这样的:

class Player
  attr_accessor :name, :health, :attacked
  alias :attacked? :attacked

  def initialize(name)
    @name = name
    @health = 100
    @attacked = false
  end
end
Run Code Online (Sandbox Code Playgroud)

attacked没有问号,但attacked?作为别名添加.