也许是从Scala学习者那里闲聊,但是...在我的修补中我写了以下内容:
( n.child.size > 0 ) && ( n.child.filter( ! _.isInstanceOf[Text] ).size == 0 )
Run Code Online (Sandbox Code Playgroud)
('n'是一个scala.xml.Node,但这并不重要.也不是特定的逻辑.)
两次打电话给孩子()并不是那么好,所以我打算改变它:
val list = n.child
( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 )
Run Code Online (Sandbox Code Playgroud)
但考虑到我已经非常欣赏能够过滤()和map()等而不需要声明中间变量,我立即发现这很臭.它就是......所以......所以Java-ish!:p
唉,通过搜索SO和谷歌以及ScalaDocs(特别是Any和AnyRef)和The Book已经找不到合适的东西.我希望也许是这样的:
n.child{ list => ( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 ) }
Run Code Online (Sandbox Code Playgroud)
甚至
n.child.with{ list => ... }
Run Code Online (Sandbox Code Playgroud)
这样的事情存在吗?或者我只是陷入了一种不变的热情?
背景
我们有一个使用Struts 2和Freemarker构建的现有webapp,我通过复制一些代码和模板创建了一个变体.克鲁迪,但可管理.然而,我们将很快制作其他一些变体(需要单独的WAR),使复制变得站不住脚.我的想法是将所有共享内容放入每个webapp包含的jar中:公共文件可以在一个地方维护,甚至更好的给定webapp可以覆盖类路径中的文件.到目前为止,我已经能够使用代码执行此操作,但是Convention插件使得为Freemarker模板执行相同操作变得困难.
问题
到目前为止,我们的webapp依靠Convention来为应用程序启动时的动作找到Freemarker"动作结果"(即模板),从而使我们不必繁琐地注释每个动作.如果我已经正确地追踪了事情,那么班级DefaultResultMapBuilder负责找到行动结果; 特别是,该方法createFromResources在webapp中查找,然后在类路径中查找与我们的操作匹配的模板文件.
这正是我想要的 - 除了我们放置模板/WEB-INF以保护它们免受外部访问(使用struts.convention.result.path我们的Struts配置中的常量).到目前为止,这个工作正常,所有模板文件都在下面/WEB-INF,但是它也不能在类路径上使用文件. DefaultResultMapBuilder当然可以在类路径上找到文件,但只有当webapp模板直接位于上下文根目录下时,因为任何类路径模板都必须位于与上下文根目录下模板的目录结构等效的包结构中.对于在"struts.convention.result.path"以"/ WEB-INF /"开头时要求的操作结果,需要一个名为"web-inf"的根包 - 但当然包名中不允许使用连字符.
(请注意,此问题与TemplateLoader以后用于实际获取模板文件的类无关.加载过程很容易配置为在许多地方查找 - 但如果找不到"操作结果",应用程序永远不会那么远如果两个进程使用相同的配置,这将是很好的...)
解决方案?
所以......我可以将所有模板移到外面,/WEB-INF但实际上我不愿意.或者我可以为每个动作类提供特定的注释,并且我宁愿不再(实际上它可能会遇到同样的问题).
或者我可以ResultMapBuilder通过复制和稍微改变来实现我自己的实现DefaultResultMapBuilder(后者中的每个成员都是私有的,所以我不能扩展类并只更改相关部分 - 唉!),然后弄清楚如何覆盖"struts-plugin.xml"Struts配置文件(更改org.apache.struts2.convention.ResultMapBuilderbean),因此我在查看类路径时可以让Convention忽略"/ WEB-INF".或者更好的是,在查看ServletContext时始终使用"/ WEB-INF /"为路径添加前缀.
但也许有一种更简单的方法?一些无证的配置魔术?
我试图使用http单元为我的应用程序读取响应标头 -
WebClient webClient = new WebClient();
WebClient.setThrowExceptionOnScriptError(false);
HtmlPage currentPage = webClient.getPage("http://myapp.com");
WebResponse response = currentPage.getWebResponse();
System.out.println(response.getResponseHeaders());
Run Code Online (Sandbox Code Playgroud)
我确实看到了响应头但它们仅限于第一个http get请求.当我使用LiveHTTPHeaders插件for firefox插件时,我得到了所有获取请求和相应的标头响应.
有没有办法为所有后续请求获取http标头,而不仅限于第一次获取?
所以我创建了一个按预期失败的示例:
scala> trait A { val v = "a" }
defined trait A
scala> trait B { this :A => ; var v = "" ; this.v = "b" }
<console>:6: error: reassignment to val
trait B { this :A => ; var v = "" ; this.v = "b" }
^
Run Code Online (Sandbox Code Playgroud)
自我类型的"这个"阴影B的"这个" - 它看起来很奇怪,但有道理.
那么,给自我类型赋予不同的名称似乎是明智的.我做到了这一点并且相当惊讶:
scala> trait C { a :A => ; var v = "" ; this.v = "c" }
<console>:6: error: reassignment …Run Code Online (Sandbox Code Playgroud)