【问题标题】:Racket: What does it mean to bind names to the index?Racket:将名称绑定到索引是什么意思?
【发布时间】:2017-09-27 17:57:00
【问题描述】:

我正在编写用户从选项列表中选择的代码。我在下面定义了我的列表:

;contains the options the user can pick
(define choices (list "choice1" "choice2" "choice3" "choice4" "choice5" "choice6" "OPENING VALUE" "HIGHEST VALUE" "LOWEST VALUE" "CLOSING VALUE" "VOLUME OF SHARES" "ADJUSTED CLOSING VALUE"))

我的按钮从以下代码的列表中获取名称(仅显示一个示例)。在这种情况下,它从列表中获取第三项:

[label (list-ref choices 2)]

当我想更改名称时,我使用代码行:

(send choice-4-9 set-label (list-ref choices 9))

我的教授评论说我应该将名称绑定到 6 7 等,以便您的代码可读。我仍然对他的意思以及我将如何做到这一点感到有些困惑。

【问题讨论】:

    标签: user-interface button racket


    【解决方案1】:

    他的意思是为每个索引定义一个绑定到该索引的标识符,理想情况下以它的含义命名,例如:

    (define choice1 0)
    (define choice2 1)
    (define choice3 2)
    ....
    

    所以现在你可以写[label (list-ref choices choice3)] 而不是[label (list-ref choices 2)]。该代码更具可读性,并且在必要时更易于更改,因为您可以更改标识符的绑定,而不是更改代码中出现数字的每个位置。

    顺便说一句,你现在所做的事情被称为使用“幻数”。

    【讨论】:

    • 这一切的重点必须是在使用它们的上下文中为数值赋予有意义的名称。如果第一选择是“拍摄佳能”,将变量choice-shoot-canon而不是choice1绑定到索引0不是更好吗?
    • @Sylwester 我假设 OP 使用 choice1 等作为示例中的简写,并且真实代码具有有意义的名称。但是,是的,如果@New_Racket_User 不清楚,人们确实希望标识符有意义。
    【解决方案2】:

    前面的答案很好,我已经投了赞成票。我只想提一下,此类事物的常见数据结构是关联列表,您可以将符号或数字之类的事物与值相关联,然后使用 assqassvassoc 查找它取决于您的查找名称是否分别需要 eq?eqv?equal?。考虑:

    (define choices
      '((shoot . "Shoot!")
        (run . "Run away!")
        (reload . "Reload")
        (appraise . "Search your surroundings")))
    
    (define (get-label choice)
      (let ((result (assq choice choices)))
        (if (not result)
            (error "???") ; handle as you see fit
            (cdr result))))
    
    ;;;;;;;;;;;;;;;;
    Welcome to DrRacket, version 6.4 [3m].
    Language: racket/base [custom]; memory limit: 8192 MB.
    > (get-label 'shoot)
    "Shoot!"
    > 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2018-06-21
      • 1970-01-01
      • 2019-02-12
      相关资源
      最近更新 更多