【发布时间】:2016-11-05 06:56:00
【问题描述】:
现在我正在使用 play2.2.1,我知道 Java,但我不知道 Scala。 如果你稍微学习一下 PlayFramework,你就会知道 Scala 在框架中的使用在一定程度上。这只是关于我的背景。问题是为什么在下面的代码中使用 Tuple2 虽然传递值的数量不是复数。
这是控制器的代码:
//Action for making a message
public static Result add() {
Form<Message> f = new Form(Message.class);
List<Member> mems = Member.find.select("name").findList();
List<Tuple2<String, String>> opts =
new ArrayList<Tuple2<String, String>>();
for(Member mem: mems) {
opts.add(new Tuple2(mem.name, mem.name));
}
return ok(add.render("fill-in form", f, opts));
}
这是模型的代码:
@Entity
public class Member extends Model {
@OneToMany(cascade = CascadeType.ALL)
public List<Message> messages = new ArrayList<Message>();
@Id
public Long id;
@Required(message = "This item is Required")
public String name;
@Email(message = "Please Fill in a message")
public String mail;
public String tel;
public static Finder<Long, Member> find = new Finder<Long, Member>(Long.class, Member.class);
@Override
public String toString() {
String ids = "{id:";
for (Message m: messages) {
ids += " " + m.id;
}
ids += "}";
return ("[id:" + id + ", message:" + ids + ", name:" + name + ", mail:" + mail + ", tel:" + tel + "]");
}
public static Member findByName(String input) {
return Member.find.where().eq("name", input).findList().get(0);
}
}
这是视图的代码:
@(msg:String, form1: Form[models.Message], opts: List[Tuple2[String, String]])
@main("Sample page") {
<h1>ADD MESSAGE</h1>
<p>@msg</p>
@helper.form(action = routes.Application.create) {
@(helper.select (
field = form1("name"),
options = opts
))
@(helper.textarea (
field = form1("message")
))
<input type="submit">
}
}
再一次,为什么 Tuple2 包含两个 String 值,尽管有一个值从控制器传递到视图? 如果我在这里展示的信息还不够,请给我评论。
【问题讨论】:
-
Scala 在“某种程度上”中未使用。 Play Framework 是用 Scala 编写的,主要是 Scala。并且还有一个Java API。而
tuple是key-value pairs最自然的结构之一,而那个特定的list看起来像key-value pairs的列表。我觉得这条线 -opts.add(new Tuple2(mem.name, mem.name))应该是 -opts.add(new Tuple2("name", mem.name)) -
确实,我尝试按照您说的进行更改。而且效果很好。那么,这里 Tuple 的第一个参数是什么意思呢?您展示的代码是有意义且有说服力的。但是,“opts.add(new Tuple2(mem.name, mem.name))”也可以,但是为什么呢?第一个参数没有任何重要意义?
-
基本上
new Tuple2("abc", "def")会创建一个Tuple2[String, String]的实例。Tuple是一个通用结构,如List或Map。以Map[String, String]为例。Map[String, String]本身没有任何意义。它只是由key映射的values的持有者。它将始终与您将如何使用该地图有关。 -
我明白了。我能理解你说的话。虽然我说它工作得很好,但现在我已经确认当我像你现在所说的那样写时编译失败。这意味着 "opts.add(new Tuple2(mem.name, mem.name))" 是可以的,但是 "opts.add(new Tuple2("name", mem.name))" 会导致错误。错误消息是这样的:
IndexOutOfBoundsException: Index: 0, Size: 0return Member.find.where().eq("name", input).findList().get(0);这意味着当代码是你的时,传递变量“name”会以某种方式失败。那么,你能解释一下吗? -
该代码是您使用
Tuple的地方,因此您必须根据创建它的方式使用它。就像当您有一个Map包含值def的键abc时,您必须执行map.get("def")才能获得abc;其他任何事情都行不通。
标签: scala playframework playframework-2.2