什么时候可以省略(省略)括号,圆点,大括号,=(函数)等的精确规则?
例如,
(service.findAllPresentations.get.first.votes.size) must be equalTo(2).
Run Code Online (Sandbox Code Playgroud)
service 是我的对象def findAllPresentations: Option[List[Presentation]]votes 回报 List[Vote]为什么我不能去:
(service findAllPresentations get first votes size) must be equalTo(2)
Run Code Online (Sandbox Code Playgroud)
?
编译器错误是:
"类型为Option [List [com.sharca.Presentation]]的RestServicesSpecTest.this.service.findAllPresentations不带参数"
为什么它认为我试图传递一个参数?为什么我必须为每个方法调用使用点?
为什么必须(service.findAllPresentations get first votes size)相等Too(2)导致:
"没找到:价值第一"
然而,"必须等于2"
(service.findAllPresentations.get.first.votes.size)必须等于2,即方法链是否正常? - 对象链链链接.
我查看了Scala的书籍和网站,无法找到全面的解释.
事实上,正如Rob H在Stack Overflow问题中解释的那样,我可以在Scala中省略哪些字符?,这是省略'.'的唯一有效用例.是用于"操作数运算符操作数"样式操作,而不是用于方法链接?
我想知道什么是最好的Scala模仿Groovy的安全解除引用运算符(?.),或者至少是一些接近的替代方案?
我在Daniel Spiewak的博客上讨论过它,但是想把它打开到StackOverFlow ......
为了每个人的时间,这是丹尼尔的最初回应,我的反击,以及他的第二个回应:
@Antony
实际上,我先看了那个.或者更确切地说,我试图从Ruby土地上复制Ragenwald和"操作员".问题是,如果没有代理,这有点困难.考虑以下表达式(使用Ruby的andand,但它与Groovy的运算符相同):
test.andand().doSomething的()
我可以从Any =>某种类型实现andand()方法创建隐式转换,但这就是魔术停止的地方.无论值是否为null,doSomething()方法仍将执行.由于它必须以类型安全的方式在某个目标上执行,这将需要实现字节码代理,这将是片状和奇怪的(注释,最终方法,构造函数等的问题).
更好的选择是回归到两者的灵感来源,以及Groovy的安全解除引用运算符:monadic map操作.以下是一些使用Option实现模式的Scala语法:
val something:Option [String] = ... //可能是Some(...)或None
val length = something.map(_.length)
在此之后,
length要么是Some(str.length)(其中str是Option中包含的String对象),要么是None.这正是安全解除引用操作符的工作原理,除了它使用null而不是类型安全的monad.如上所述,我们可以从某种类型T => Option [T]定义隐式转换,然后以这种方式映射,但是某些类型已经定义了映射,因此它不会非常有用.或者,我可以实现类似于map但具有单独名称的东西,但无论如何实现它,它将依赖于高阶函数而不是简单的链式调用.它似乎只是静态类型语言的本质(如果有人能解决这个问题,请随时纠正我).
Daniel Spiewak,2008年7月7日星期一下午1:42
我的第二个问题:
感谢Daniel对此的回应?我想我错过了!我想我明白你的建议是什么,但是假设你无法控制来源,那么这样的事情是怎样的:
company?.getContactPerson?.getContactDetails?.getAddress?.getCity
Run Code Online (Sandbox Code Playgroud)
假设它是一个java bean,你不能进入并将返回值更改为Something [T] - 我们可以在那里做什么?
Antony Stubbs 2009年7月21日星期二晚上8:07哦天哪 - 重新阅读那就是你提出从T到Option [T]的隐式转换的权利吗?但是你还能像这样把它连在一起吗?你还需要地图吗?嗯....
var city = company.map(_.getContactPerson.map(_.getContactDetails.map(_.getAddress.map(_.getCity))))
Run Code Online (Sandbox Code Playgroud)
?
Antony Stubbs于2009年7月21日星期二晚上8:10发布
他的第二回应:
@Antony
在公司的情况下,我们真的无法做很多事情吗?.getContactPerson等等......即使假设这是有效的Scala语法,我们仍然需要一些方法来阻止链中的后续调用.如果我们不使用函数值,这是不可能的.因此,像地图这样的东西确实是唯一的选择.
对Option的隐式转换不会很糟糕,但是通过隐含事物,我们会绕过对类型系统的一些保护.做这种事情的最好方法是使用与Option一致的for-comprehension.我们可以做map和flatMap,但它的魔法语法更好:
for {
c < - company
person <- c.getContactPerson
details <- person.getContactDetails
address <- details.getAddress
} yield address.getCity …Run Code Online (Sandbox Code Playgroud) 在之前渲染多个 SwiftUI 时,它们总是在垂直堆栈中渲染。我想将它们水平或理想地放在网格上。因为我的屏幕上有更多的水平空间。
必须在多个预览之间上下滚动是没有效率的,尤其是当您有两个以上的预览时。
任何人都知道解决方法,或者是否可能?
更新:例如,正如您在屏幕截图中看到的,我希望水平并排显示这两个预览。
Xcode 12.0 测试版 (12A6159)
我正在尝试创建一个包含绘图的子视图,我希望该绘图的大小与父容器的一部分成比例。
除非将其放入层次结构上方的滚动视图中,否则效果很好。
从屏幕截图中可以看出,堆栈内部的声音正如预期的那样最大。但是,当您放入滚动视图时,几何读取器的大小会折叠到接近零,并且其子级会溢出其边界。就好像它在不同的 Z 索引上渲染其子级一样。事实上,如果您从几何渲染内容中删除包装 VStack,它实际上不会像包装在 ZStack 中一样布局其所有子级。
编辑: 要明确的是:ScrollView 不属于组件。该组件不应该知道它是否在 ScrollView 中 - 它只是一个可怜的无助组件,被扔来扔去。这就是为什么我将 ScrollView 放入预览代码中,而不是组件中。
我尝试过各种固定尺寸、男士、杂志和理想的组合。我能找到的唯一解决方法是这个hacky 解决方案- 靠近底部的问题的编辑部分,其中几何读取器报告的宽度通过变通方法捕获到状态变量中,然后重新用于设置 a 的帧大小兄弟视图。
请注意,我是一个完全的初学者。滚动视图和几何阅读器之间似乎存在一些交互,超出了我目前的理解。
似乎是一个令人困惑的话题。
import SwiftUI
struct ScrollViewGeoReader: View {
var body: some View {
GeometryReader{ g in
VStack{
let width = g.size.width
Circle().frame(width: width/3, height: width/3, alignment: .center)
Text("inside geo")
Text("inside geo")
Text("inside geo \(width)")
Text("inside geo")
Text("inside geo")
}
.border(Color.green, width: 2)
}
.border(Color.red, width: 3)
}
}
struct ScrollViewGeoReader_Previews: PreviewProvider { …Run Code Online (Sandbox Code Playgroud) 除了Wicket简单性的论点(即Wicket是一个更简单的系统IMHO)和GWT在客户端的响应(GWT的客户端状态和JavaScript - 可能是复杂的客户端代码)和GWT更大的扩展潜力,有什么争论使用GWT而不是Wicket?
就个人而言,我做了很多Wicket开发,但很久以前只是快速浏览了GWT.
所以我的目标是使用 WebClient 发出多个并发请求,等到它们全部完成,然后合并结果。这是我到目前为止所拥有的:
...
Flux<ServerResponse> feedResponses = request
.bodyToMono(AddFeedRequestDto.class)
.map(AddFeedRequestDto::getFeeds) // Returns a list of RSS feed URLs
.map(this::getServerResponsesFromUrls) // Returns a list of Mono<Feed>
.map(Flux::merge) // Wait til all requests are completed
// Not sure where to go from here
...
/** Related methods: **/
private List<Mono<Feed>> getServerResponsesFromUrls(List<String> feedUrls) {
List<Mono<Feed>> feedResponses = new ArrayList<>();
feedUrls.forEach(feedUrl -> feedResponses.add(getFeedResponse(feedUrl)));
return feedResponses;
}
public Mono<Feed> getFeedResponse(final String url) {
return webClient
.get()
.uri(url)
.retrieve()
.bodyToMono(String.class) // Ideally, we should be able …Run Code Online (Sandbox Code Playgroud)