首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案/球拍:可扩展功能

方案/球拍:可扩展功能
EN

Stack Overflow用户
提问于 2014-12-08 06:30:12
回答 1查看 105关注 0票数 0

我希望为不同类型的对象构建数据结构,这些对象具有不同的访问相同类型参数的方法。例如,

圆圈对象的x-coord前有一个组代码作为10,而行对象的x-coord前有一个标头,为30。而且,对象并不总是具有相同的参数。

因此,从任何对象提取所有必要参数的泛型函数如下所示:

代码语言:javascript
复制
(define (build-struct lst)
  (if (empty? lst)
      empty
      (begin (make-entity (find-params (string=? (car (car lst)))))
             (build-struct (cdr lst)))))
    ;function to build structs from a list of lists (that contain an object)

(define-struct entity (name x-coord y-coord layer-name [num-vertices #:auto] [radius #:auto] [start-angle #:auto] [end-angle #:auto])
  #:auto-value empty)
;data struct to store object param values

(define (find-circle-param lst parameter)
  (let ((kw (string-upcase parameter)))
    (if (empty? lst)
        '() ;put error message here
        (cond ((and (string=? kw "X-COORD") (= (car lst) "10"))
               (cadr lst))
              ((and (string=? kw "Y-COORD") (= (car lst) "20"))
               (cadr lst))
              ((and (string=? kw "LAYER-NAME") (= (car lst) "8"))
               (cadr lst))
              ((and (string=? kw "RADIUS") (= (car lst) "40"))
               (cadr lst))
              (else #f)))))
(define (find-line-param lst parameter)
  (let ((kw (string-upcase parameter)))
    (if (empty? lst)
        '() ;put error message here
        (cond ((and (string=? kw "X-COORD-START") (= (car lst) "10"))
               (cadr lst))
              ((and (string=? kw "Y-COORD-START") (= (car lst) "20"))
               (cadr lst))
              ((and (string=? kw "X-COORD-END") (= (car lst) "11"))
               (cadr lst))
              ((and (string=? kw "Y-COORD-END") (= (car lst) "21"))
               (cadr lst))
              ((and (string=? kw "LAYER-NAME") (= (car lst) "8"))
               (cadr lst))
              (else #f)))))
;functions to find parameter value depending on object type

我只想创建一个函数来寻找参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-08 12:55:09

结构可以有一个超级类型。如果您有几个具有共同属性的结构,请考虑给它们一个普通的超级类型。下面是一个示例:

代码语言:javascript
复制
#lang racket
(struct shape        (x y)         #:transparent) ; all shapes has x and y coordinates
(struct circle shape (radius)      #:transparent) ; a circle has besides the center also a radius
(struct line   shape (x-end y-end) #:transparent) ; a line has besides its start point also end coords    
(define c (circle 1 2 3))
(define l (line   4 5 6 7))

(define (position a-shape)
  (match a-shape
    [(shape x y)  (list "Position:" x y)]
    [_            (error 'position "expected a shape, got ~a" a-shape)]))

(position c)
(position l)

请注意,位置的定义可以同时找到圆和线的位置,而不需要在位置定义中明确提到圆和线。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27352550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档