Scala中的匿名类型

Gam*_*ega 5 scala

试图将我的几个C#项目转换为Scala,并且仍在试图弄清楚如何进行某些转换.我遇到了这段代码,如果有人可以帮我写下Scala中的代码,我会很感激,我对Select语句中的匿名代码块特别感兴趣.

static void Main(string[] args)
{
  Stock stk = new Stock();
  Select(stk, a => new { a.Prices, a.Symbol });
}
public static U Select<T, U>(T data,Func<T,U> item)
{
  return item(data);
}
Run Code Online (Sandbox Code Playgroud)

小智 8

这是一个实现.

class Stock(val prices: List[Double], val symbol: String) 

object CSharp {
  def select[T, U](data: T)(f: T => U): U = {
    f(data);
  }  
  def main(args: Array[String]): Unit = {
    val stk = new Stock(List(1.1, 2.2, 3.3, 4.4), "msft")
    select(stk)(a => (a.prices, a.symbol) );
  }
}
Run Code Online (Sandbox Code Playgroud)


om-*_*nom 5

这将是一个更单一,更低效的(因为scala将使用反射来做这些令人讨厌的事情):

def select[T, U](data: T, item: T => U) = item(data)
case class Stock(price: Int, symbol: String)


val x = select(
  Stock(100, "AAPL"), 
  { stock: Stock => new { val price = stock.price; val symbol = stock.symbol }}
)

x.symbol
res2: String = AAPL
Run Code Online (Sandbox Code Playgroud)

一般来说,你应该更喜欢元组(Ben的答案)或案例类.