2015-06-12 7 views
0

Как вы знаете Касбу MongoDB драйвер имеет функцию обновления, как это:Weird карринг функции обновления в MongoCollection класса драйвера Касба Монго

def update [A, B] (q: A, o: B)(implicit arg0: (A) ⇒ DBObject, arg1: (B) ⇒ DBObject) : WriteResult 

Я думаю, что я понимаю выделку понятия Скале. Однако, насколько я знаю, эта функция обновления должна использоваться следующим образом:

collection.update(MongoDBObject(...), MongoDBObject(...)) 

Это меня смущает. Как я не заполнить второй список аргументов метода обновления, я думаю, что выше выражение будет возвращать функцию, как:

(implicit arg0: (A) ⇒ DBObject, arg1: (B) ⇒ DBObject) => WriteResult 

Однако это не так. Это из-за неявного определения аргументов во втором списке аргументов функции?

+0

Если у вас есть неявное значение типа 'A => DBObject' и неявное значение' B => DBObject' в области видимости, то эти значения применяются при вызове 'update'. Хотя, если вы хотите частично применить функцию, вы должны сделать это, вызвав 'collection.update (MongoDBObject (...), ...) _' (добавление подчеркивания) –

+0

Я не понимаю, как это сделать однако в сфере охвата. Я думаю, мне нужно будет увидеть исходный код под реализацией currying, чтобы полностью понять, что он действительно находится в сфере охвата. Мне трудно понять, когда что-то находится в сфере видимости или нет. –

+0

Я не знаю casbah, поэтому я, вероятно, не могу вам помочь. Тем не менее, это меньше о карри, чем о неведениях. Похоже, в этом случае currying требуется только для добавления неявных аргументов (потому что вы не можете указать, например, 'def f (a: int, implicit b: Int)', но только 'def f (a: Int) (неявный b : Int) 'по какой-либо причине) Возможно, вы можете обновить вопрос, включив в него все свои импортные ресурсы, чтобы можно было выяснить, где находятся импликации. –

ответ

0

Библиотека Casbah подписалась на образец «сутенер моей библиотеки». Он расширяет официальный драйвер Java MongoDB и добавляет импликации и другие функции, чтобы заставить Java-драйвер чувствовать себя «родным» в scala.

update метод выглядит следующим образом:

/** 
    * Performs an update operation. 
    * @param q search query for old object to update 
    * @param o object with which to update <tt>q</tt> 
    */ 
    def update[A, B](q: A, o: B, upsert: Boolean = false, multi: Boolean = false,concern: com.mongodb.WriteConcern = this.writeConcern 
this.writeConcern)(implicit queryView: A => DBObject, 
          objView: B => DBObject, 
          encoder: DBEncoder = customEncoderFactory.map(_.create).orNull): WriteResult = { 
    underlying.update(queryView(q), objView(o), upsert, multi, concern, encoder) 
} 

Драйвер Java требует DBObject своей операции обновления, но Касба предоставляет помощник Scala для создания DBObjects в MongoDBObject. Чтобы обеспечить взаимодействие между типами Scala и Java-типом, мы можем использовать implicit parameters.

Поскольку компилятор будет знать A во время компиляции, он может определить, имеет ли неявное определение type A => DBObject. Затем Casbah использует этот метод queryView(q), который преобразует q в DBObject и передает его базовому обновлению.

 Смежные вопросы

  • Нет связанных вопросов^_^