繁体   English   中英

如何使类的属性不区分大小写?

[英]How can I make a property of a class case-insensitive?

在CoffeeScript中,假设我有以下内容:

class Greeter
    message: ->
        greeting = switch @gender
            when 'male' then 'Sir'
            when 'female' then 'Madame'
            else 'Unknown'

        "Hello #{greeting}!"

greeter = new Greeter
greeter.gender = 'Male'
alert greeter.message()

当前,此警报提醒Hello Unknown! 当我要输出Hello Sir!

如何使Greeter类将@gender实例变量小写,以便获得正确的输出? 我不想在message方法中仅将其小写,而是在整个Class实例中将其全部小写。 这样,它也可以在其他方法中工作。

我想我缺少了一些非常基本的东西,但是似乎无法绕开它。

注意:对于那些说我把“ Male”的大小写弄错的人。 是的,我是故意这样做的。 我希望该类在使用之前在所有情况下自动小写gender 因此,用户可能会弄​​错大写字母,并且仍然可以使用。

原因是我最终希望将其推论到其他情况,而不是仅仅处理不区分大小写的问题。

有人提到了JavaScript Getters和Setters,它们相对较新,因此在所有主流浏览器中都不支持。 我来看看那些。 我对Ruby有点熟悉。

Male不是male 尝试将字符串标准化为小写:

message: ->
    greeting = switch @gender.toLowerCase()
        when 'male' then 'Sir'
        when 'female' then 'Madame'
        else 'Unknown'

如有必要,您可能希望将对小写的调用封装在某些属性getter中https: //stackoverflow.com/a/11592890/2363712诸如此类:

class Greeter
    constructor: ->
        Object.defineProperty  @, 'gender',
            get: ->
                return @_gender
            set: (value) ->
                @_gender = value.toLowerCase()

    message: ->
        greeting = switch @gender
            when 'male' then 'Sir'
            when 'female' then 'Madame'
            else 'Unknown'

        "Hello #{greeting}!"

为此,您的运行时环境必须支持Object.defineProperty
请参阅该表以快速查找受支持的浏览器。

coffee> 
  class Greeter
    message: =>
        greeting =
          if /^male/i.test(@gender) then 'Sir'
          else if /^female/i.test(@gender) then 'Madame'
          else 'Unknown'

        "Hello #{greeting}!"

greeter = new Greeter
greeter.gender = 'Male'
greeter.message()

'Hello Sir!'
coffee> greeter.gender  = 'female' 
'female'
coffee> greeter.message()
'Hello Madame!'
coffee> greeter.gender  = 'smizmar' 
'smizmar'
coffee> greeter.message()
'Hello Unknown!'
coffee> 

因此,这是执行此操作的简单方法,但它不会更改存储的值。 为此,您需要使用Object.defineProperty(对此的答案)

Function::property = (prop, desc) ->
  Object.defineProperty @prototype, prop, desc

class Greeter
  constructor: () ->
  @property 'gender',
    get: -> "#{@ciGender}"
    set: (v) -> @ciGender = v.toLowerCase()
  message: ->
    greeting = switch @ciGender
        when 'male' then 'Sir'
        when 'female' then 'Madame'
        else 'Unknown'

    "Hello #{greeting}!"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM