trait A { def x = 1 }
trait B extends A { override def x = super.x * 5 }
trait C1 extends B { override def x = 2 }
trait C2 extends A { this: B => override def x = 2}
// 1.
println((new C1 with B).x) // 2
println((new C2 with B).x) // 10
// 2.
trait X {
type SomeA <: A
trait Inner1 { this: SomeA => } // compiles ok
trait Inner2 extends SomeA {} // doesn't compile
}
Вот рабочий пример Lucene.NET с использованием настраиваемого фильтра, на который вы можете взглянуть:
using System;
using System.Collections;
using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
class Program
{
static void Main(string[] args)
{
Directory index = new RAMDirectory();
Analyzer analyzer = new KeywordAnalyzer();
IndexWriter writer = new IndexWriter(index, analyzer, true);
Document doc = new Document();
doc.Add(new Field("title", "t1", Field.Store.YES,
Field.Index.TOKENIZED));
writer.AddDocument(doc);
doc = new Document();
doc.Add(new Field("title", "t2", Field.Store.YES,
Field.Index.TOKENIZED));
writer.AddDocument(doc);
writer.Close();
Searcher searcher = new IndexSearcher(index);
Query query = new MatchAllDocsQuery();
Filter filter = new LuceneCustomFilter();
Sort sort = new Sort("title", true);
Hits hits = searcher.Search(query, filter, sort);
IEnumerator hitsEnumerator = hits.Iterator();
while (hitsEnumerator.MoveNext())
{
Hit hit = (Hit)hitsEnumerator.Current;
Console.WriteLine(hit.GetDocument().GetField("title").
StringValue());
}
}
}
public class LuceneCustomFilter : Filter
{
public override BitArray Bits(IndexReader indexReader)
{
BitArray bitarray = new BitArray(indexReader.MaxDoc());
int[] docs = new int[1];
int[] freq = new int[1];
TermDocs termDocs = indexReader.TermDocs(
new Term(@"title", "t1"));
int count = termDocs.Read(docs, freq);
if (count == 1)
{
bitarray.Set(docs[0], true);
}
return bitarray;
}
}
Здесь немного запутано, потому что передача массива на самом деле передает его по ссылке. Например, следующее рекламное объявление напечатает 10 10 10 10 10, показывая, что значения массива были обновлены.
Я что-то упустил?
public void TestPassing()
{
int[] stuff = new int[] {5, 5, 5, 5};
Add(stuff, 5);
for (int i = 0; i < stuff.Length; i++)
{
Console.Write(stuff[i]);
}
}
public void Add(int[] stuff, int x)
{
for(int i = 0; i < stuff.Length; i++)
{
stuff[i] = stuff[i] + x;
}
}