我是Clojure新手并且正在寻找何时使用协议以及何时使用多方法的一些具体示例.我知道协议通常适用于创建类型层次结构和典型的OOP事物,它们是在多方法之后添加到语言中的,并且协议通常具有更好的性能,所以我的问题是:
协议是否意味着取代多方法?如果没有,你能给我一个例子,我会使用多方法而不是协议吗?
可能重复:
如何解除引用函数指针?
void myprint(char* x) {
printf("%s\n", x);
}
int main() {
char* s = "hello";
void (*test)(char*);
void (*test2)(char*);
test = myprint;
test2 = &myprint;
test(s);
(*test)(s);
test2(s);
(*test2)(s);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么以上所有代码都有效?"你好"打印四次.通过应用函数指针,它是否隐式解除了?基本上我想知道函数指针是如何实际存储的,因为上面的内容有点令人困惑.
我正在使用正则表达式来查找任何URL并相应地链接它们.但是,我不希望链接任何已链接的URL,因此我使用lookbehind来查看URL之前是否有href.但这失败了,因为PHP的前瞻和后瞻不允许使用可变长度量词.
这是匹配的正则表达式:
/\b(?<!href\s*=\s*[\'\"])((?:http:\/\/|www\.)\S*?)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?
编辑:
我还没有对它进行测试,但我认为在单个正则表达式中进行此操作的技巧是在正则表达式中使用条件表达式,这是PCRE支持的.它看起来像这样:
/(href\s*=\s*[\'\"])?(?(1)^|)((?:http:\/\/|www\.)\w[\w\d\.\/]*)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)
关键点在于,如果捕获了href,则由于条件而立即抛出匹配(?(1)^|),这保证不匹配.可能有些问题.我明天会测试一下.
我有一个JPanel和一个JButtons矢量,并希望将每个按钮添加到面板.
我遇到的问题是我有一个代表按钮矢量的变量btns,但宏函数只是将其视为符号,而不是矢量.有办法以某种方式扩展它吗?
这是代码:
(defmacro add_all [panel btns]
;; help?
)
(let [x 10, y 10
btns get_buttons] ;; just a vector of JButton objects
(doto (JPanel.)
(.setLayout (GridLayout. x y))
(add-all btns)))
Run Code Online (Sandbox Code Playgroud)
我希望这扩展到:
(doto (JPanel.)
(.setLayout (GridLayout. x y))
(.add (btns 0))
(.add (btns 1))
;; etc
(.add (btns 99)))
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个允许单引号或双引号字符串的正则表达式,并允许字符串中的相反引号字符.例如,以下两者都是合法的字符串:"你好'那里'世界'"你好"那里"世界"
我正在使用的正则表达式使用负向前瞻,如下所示:
(['"])(?:(?!\1).)*\1
Run Code Online (Sandbox Code Playgroud)
我认为这会起作用,但如果语言不支持负面前瞻怎么办呢.有没有其他方法可以做到这一点?没有交替?
编辑:
我知道我可以使用轮换.这更像是一个假设的问题.假设我在初始角色类中有20个不同的角色.我不想写出20种不同的变化.我试图实际上否定捕获的角色,而不使用前瞻,后视或交替.