在我的Scala应用程序中,我有一个函数调用一个返回Future [T]类型结果的函数.我需要在递归函数调用中传递映射结果.我希望这是尾递归,但地图(或flatMap)打破了这样做的能力.我收到错误"递归调用不在尾部位置."
以下是此方案的一个简单示例.如何修改它以便调用尾部递归(不用Await.result()来破坏Futures的好处)?
import scala.annotation.tailrec
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
implicit val ec = scala.concurrent.ExecutionContext.global
object FactorialCalc {
def factorial(n: Int): Future[Int] = {
@tailrec
def factorialAcc(acc: Int, n: Int): Future[Int] = {
if (n <= 1) {
Future.successful(acc)
} else {
val fNum = getFutureNumber(n)
fNum.flatMap(num => factorialAcc(num * acc, num - 1))
}
}
factorialAcc(1, n)
}
protected def getFutureNumber(n: Int) : Future[Int] = Future.successful(n)
}
Await.result(FactorialCalc.factorial(4), 5.seconds)
Run Code Online (Sandbox Code Playgroud) 我正在使用受控输入创建一个简单的表单.在我的组件状态中,我在状态上有2个属性"clientName"和"license".改变这些工作正常.但是有一个"运输"属性是一个对象.更改任何运输属性会产生错误.例如,如果我更改"address1",只要在handleShippingChange函数中设置了状态,我就会收到错误:
警告:TextField正在更改类型文本的受控输入以使其不受控制.输入元素不应从受控切换到不受控制(反之亦然).决定在组件的使用寿命期间使用受控或不受控制的输入元素.
我怀疑它与我如何定义那些TextFields的值以及我如何设置运输属性的状态有关.我究竟做错了什么?我的组件的代码如下:
import React, {Component} from 'react';
import TextField from 'material-ui/TextField';
import RaisedButton from 'material-ui/RaisedButton';
import 'whatwg-fetch';
class Clients extends Component {
constructor() {
super();
this.state = {
"clientName": "client name",
"shipping": {
"name": "name",
"address1": "address 1",
"address2": "address 2",
"city": "city",
"state": "state",
"zip": "zip",
"country": "country"
},
"license": "license"
};
this.handleChange = this.handleChange.bind(this);
this.handleShippingChange = this.handleShippingChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
};
handleChange(event) {
this.setState({
[event.target.name]: this.getFieldValue(event.target)
});
};
handleShippingChange(event) {
this.setState({
shipping: {
[event.target.name]: this.getFieldValue(event.target)
}
}); …Run Code Online (Sandbox Code Playgroud)假设我的mongo集合中有一个文档,如下所示:
{
"_id": 123,
"field_to_prune":
{
"keep_field_1": "some value",
"random_field_1": "some value",
"keep_field_2": "some value",
"random_field_2": "some value",
"random_field_3": "some value"
}
}
Run Code Online (Sandbox Code Playgroud)
我想修剪该文档看起来像这样:
{
"_id": 123,
"field_to_prune":
{
"keep_field_1": "some value",
"keep_field_2": "some value"
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我的问题是我不知道"随机"字段名称是什么.在mongo中,除了几个已知的字段之外,我将如何取消所有字段?
我可以想到几种方法,但我不知道语法..我可以选择所有字段NAMES,然后为每一个取消设置该字段.有点像这样:
[Some query to find all field names under "field_to_prune" for id 123].forEach(function(i) {
var key = "field_to_prune." + i;
print("removing field: " + key);
var mod = {"$unset": {}};
mod["$unset"][key] = "";
db.myCollection.update({ _id: "123" }, mod);
});
Run Code Online (Sandbox Code Playgroud)
我想要做的另一种方法是取消设置字段名称不在我定义的字符串数组中的位置.不知道怎么做.有任何想法吗?
我试图从N树数据结构返回一个小部件列表.在我的单元测试中,如果我有大约2000个小部件,每个小部件都有一个依赖,我会遇到堆栈溢出.我认为正在发生的是for循环导致我的树遍历不是尾递归.什么是在scala中写这个的更好方法?这是我的功能:
protected def getWidgetTree(key: String) : ListBuffer[Widget] = {
def traverseTree(accumulator: ListBuffer[Widget], current: Widget) : ListBuffer[Widget] = {
accumulator.append(current)
if (!current.hasDependencies) {
accumulator
} else {
for (dependencyKey <- current.dependencies) {
if (accumulator.findIndexOf(_.name == dependencyKey) == -1) {
traverseTree(accumulator, getWidget(dependencyKey))
}
}
accumulator
}
}
traverseTree(ListBuffer[Widget](), getWidget(key))
}
Run Code Online (Sandbox Code Playgroud) 我正在使用MVCGrid.net(http://mvcgrid.net).首先,神奇的网格工具!我的网格正常工作,但是当我填充网格时,我需要将另一个参数传递给我的RetrieveDataMethod.我需要传递的值是我的视图模型的一部分,我很确定我需要将它作为AdditionalQueryOption传递.我不希望这是一个过滤器,因为我不希望它只在客户端事件后发送.我希望它总是传递给我的RetrieveDataMethod.我尝试将data-mvcgrid-type ='additionalQueryOption'添加到我的隐藏输入中,但仍未发送.然后我注意到这需要data-mvcgrid-apply-additional ='event'来触发事件.这与过滤器有什么不同?是否有一个网格加载事件,我可以挂钩注册我的隐藏值作为一个额外的查询选项?对我的情况有什么正确的解决方法?
这是我的网格的检索数据方法定义:
.WithRetrieveDataMethod((context) =>
{
var options = context.QueryOptions;
// this is the bit i need
var projectId = ???;
options.AdditionalQueryOptions.Add("projectId", projectId);
int totalRecords;
var items = ReportManager.GetReports(out totalRecords, options);
return new QueryResult<ReportSummaryViewModel>()
{
Items = items,
TotalRecords = totalRecords
};
})
Run Code Online (Sandbox Code Playgroud)
这是查看代码:
<h1>Reports for @Model.ProjectName</h1>
<p class="form-inline">
<button type="button" class="btn btn-default" onclick="window.location.href='@Url.Action("Index", "Home")'">Back</button>
<button type="button" class="btn btn-primary" onclick="window.location.href='@Url.Action("Create", "Reports", new { @id = Model.ProjectId })'">New Report</button>
</p>
<!-- This is the hidden input i'd like …Run Code Online (Sandbox Code Playgroud)