代码之家  ›  专栏  ›  技术社区  ›  Simon

如何为名称以问号结尾的属性定义setter?

  •  6
  • Simon  · 技术社区  · 15 年前

    我正在尝试添加名为“启用”的属性。一个既有getter又有setter的模型。但是,当我执行以下操作时:

    def enabled?= value
      # .. logic goes here ..
    end
    

    我得到 syntax error, unexpected '?', expecting '\n' or ';'

    我应该做什么?

    5 回复  |  直到 12 年前
        1
  •  10
  •   sepp2k    15 年前

    是的,Ruby语法只允许 ? 在方法名中,如果它是最后一个字符,那么 foo?= 无效。你能做的一件事,那将是相当惯用的,就是定义 enabled? , enable disable (或) enable! disable! 如果你想强调他们正在改变方法)。

    如果这不符合你的需要,你只需说出方法的名称 启用? enabled= 只是生活在名字之间的轻微的不相容。

        2
  •  7
  •   Steve Weet    15 年前

    Ruby中的方法名以小写字母或下划线开头,可选地后跟大写和小写字母、下划线和数字。方法名可以选择以问号、感叹号或等号结尾。

    所以你不能!

    您可以按照通常的Ruby习惯用法将enabled定义为:

    def enabled?
      @enabled
    end
    
    def enabled=(value)
      @enabled = value
    end
    

    总结。如果要将属性公开给外部世界,请确保变量名允许在方法名规则的范围内公开。

        3
  •  1
  •   Martin Fenner    12 年前

    一个小的变化是对getter方法进行别名,允许 enabled enabled? :

    def enabled
      @enabled
    end
    
    def enabled=(value)
      @enabled = value
    end
    
    alias_method :enabled?, :enabled
    
        4
  •  0
  •   Chubas    15 年前

    给你的财产命名 enabled

    查询方法只是语法上的糖分,并不意味着被用作属性或实例变量。您可以添加方法 enabled? 如果你愿意的话,还可以加上句法糖分。

        5
  •  0
  •   Shane N    15 年前

    我总是将布尔变量命名为以“is”开头,如“isEnabled”中所示。然后,它的含义与问号不需要复杂的含义相同。

    推荐文章