我一直在使用Scala Macros并在宏中使用以下代码:
val fieldMemberType = fieldMember.typeSignatureIn(objectType) match {
case NullaryMethodType(tpe) => tpe
case _ => doesntCompile(s"$propertyName isn't a field, it must be another thing")
}
reify{
new TypeBuilder() {
type fieldType = fieldMemberType.type
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经成功了c.universe.Type fieldMemberType.这表示对象中某个字段的类型.一旦我得到了,我想TypeBuilder在reify中创建一个新对象.TypeBuilder是一个带抽象参数的抽象类.这个抽象参数是fieldType.我希望这fieldType是我之前找到的类型.
运行此处显示的代码会返回一个fieldMemberType not found.有什么方法可以让我fieldMemberType在reify子句中工作吗?
我正在制作一个通过反射字段值设置的 Scala 应用程序。这工作正常。
但是,为了设置字段值,我需要一个创建的实例。如果我有一个带有空构造函数的类,我可以使用 classOf[Person].getConstructors 轻松做到这一点....
但是,当我尝试使用具有非空构造函数的 Case 类执行此操作时,它不起作用。我拥有所有字段名称及其值,以及我需要创建的对象类型。我可以用我所拥有的以某种方式实例化 Case Class 吗?
我唯一没有的是来自 Case Class 构造函数的参数名称,或者一种在没有参数的情况下创建它然后通过反射设置值的方法。
我们来看例子。
我有以下
case class Person(name : String, age : Int)
class Dog(name : String) {
def this() = {
name = "Tony"
}
}
class Reflector[O](obj : O) {
def setValue[F](propName : String, value : F) = ...
def getValue(propName : String) = ...
}
//This works
val dog = classOf[Dog].newInstance()
new Reflector(dog).setValue("name", "Doggy")
//This doesn't
val person = classOf[Person].newInstance //Doesn't work
val ctor …Run Code Online (Sandbox Code Playgroud) 有没有办法使用scala-macros获取给定构造函数的参数名称?
谢谢
我有一个WebPage,这是90%的Javascript.所有WebSite都是动态呈现的.
我希望服务器也能呈现这些内容,以便Google可以抓取并索引我的所有内容和链接.
我知道为了不被谷歌禁止,动态页面和服务器呈现页面的内容必须几乎相同.
我不想编写两个不同的页面(一个来自带有Handlebars的客户端,另一个来自带有ERB的服务器).
所以我想到了PhantomJS.我想要的是当我从谷歌获得_escaped_fragment_ param时,我用PhantomJS打开没有它的页面,我将它从PhantomJS渲染为HTML并将其从服务器返回给Google.这样,我就不必为任何东西创建两个不同的页面.
我知道我也可以使用Handlebars进行服务器端模板化,但无论如何我必须对所有内容进行编码.
有谁知道如何使用PhantomJS实现这一目标?有没有其他方法可以不重复逻辑和代码两次并让Google为网站编制索引?
谢谢!!!
scala ×3
scala-macros ×3
macros ×2
reflection ×2
case-class ×1
constructor ×1
dynamic ×1
phantomjs ×1
scala-2.10 ×1
seo ×1
server-side ×1