使用指南

扩展星盘

把自己的分析规则挂到星盘上——三种编程语言各自的扩展点。

适合:开发者

排盘结果是数据,怎么解读是各家的事。斗数流派众多、判断规则千人千面, 把它们全塞进核心既不可能也不该做。x-iztro 的做法是让你把自己的规则 以方法的形式挂到星盘上,调用语法与内置方法一致。

三种编程语言的扩展点

每种编程语言用它自己最自然的机制,不强行统一成一套:

编程语言机制检查时机作用范围
Rust扩展 trait编译期use 了才可见
Python往类上挂方法运行期进程内全局
Go结构体嵌入编译期只影响自己的类型

三者都做同一件事:chart.my_method() 这样调用,且能用上星盘的全部内置能力。 具体写法与可运行示例见各自的页面。

共同的约定

一个例子

三种编程语言实现同一个插件:取命宫主星(空宫借对宫),并读出五行局的局数。

trait MyAnalysis {
    fn major_star(&self) -> String;
}

impl MyAnalysis for Astrolabe {
    fn major_star(&self) -> String {
        let soul = self.palace(Palace::Soul).expect("命宫必然存在");
        let source = if soul.is_empty() { soul.opposite_palace() } else { soul };
        source.major_stars.iter()
            .filter(|s| s.star_type == StarType::Major)
            .map(|s| translate_star(s.key, self.language))
            .collect::<Vec<_>>().join(",")
    }
}

chart.major_star()   // 紫微

三段代码在同一张盘上都返回 紫微,换成英文盘则都返回 emperor

本页目录