我想创建一个名为“map”的扩展方法来制作单个对象的内联映射。例如,如果您有一些json数据结构:
<tr <?php if($result['dress_quantity'] < 10){ echo "bgcolor='#FF0000';} ?>
不幸的是,我必须决定是否要使用此(我的)地图扩展方法,或者是否要使用ListExtensions.map方法。
有没有办法避免这个问题?我也对隐藏扩展方法/使用前置问题的一般答案感兴趣。
答案 0 :(得分:1)
不幸的是,似乎没有关于如何处理优先级或如何隐藏隐式导入的xtend扩展的任何文档。
如果库方法和您的自定义方法具有明确的签名,则在使用静态扩展导入时它应该正常工作。我已经成功测试了这个:
package test1
class CustomListExtensions {
static def <T, R> map(T original, (T)=>R transformation) {
return transformation.apply(original);
}
}
用法示例:
package test2
import static extension test1.CustomListExtensions.*
class Test1 {
def static void main(String[] args) {
// uses org.eclipse.xtext.xbase.lib.ListExtensions.map
val mappedList = #["hello", "world"].map['''«it» has length «length»''']
// uses test1.CustomListExtensions.map
val mappedObject = "hello CustomListExtensions".map['''«it» has length «length»''']
mappedList.forEach[println(it)]
println(mappedObject)
}
}
输出:
hello has length 5
world has length 5
hello CustomListExtensions has length 26
如果您使用扩展提供程序(使用非静态方法)而不是静态扩展导入,那么扩展提供程序似乎优先于库方法:
包test1
class CustomListExtensions2 {
def <T, R> map(T original, (T)=>R transformation) {
return transformation.apply(original);
}
}
用法:
package test2
import test1.CustomListExtensions2
class Test2 {
val extension CustomListExtensions2 = new CustomListExtensions2
def void main() {
// uses test1.CustomListExtensions.map (<List<String>, String>)
val mappedObject1 = #["hello", "world"].map['''«it» has length «length»''']
// uses test1.CustomListExtensions.map (<String, String>)
val mappedObject2 = "hello CustomListExtensions".map['''«it» has length «length»''']
println(mappedObject1)
println(mappedObject2)
}
}
输出:
[hello, world] has length 2
hello CustomListExtensions has length 26