我正在使用Groovy语言,它具有动态类型(以及可选的静态类型).它还具有对列表,地图和范围的本机支持,因此我发现自己使用列表和地图很多,尤其是列表列表,地图列表,列表地图等.
在静态语言(尤其是泛型)中,您始终可以了解您的类型.我对动态语言相当新,而且跟踪我的变量应该是什么有点困难,所以我想知道其他人是否使用某种变量命名约定来保持这些.
例如,假设我有一个日期为键的映射,而整数为值.或整数列表,或包含字符串作为键和帐户对象作为值的映射列表.
似乎在变量名后面创建一个明确的约定将帮助我跟踪我正在处理的数据类型结构,而不必查找它.
有小费吗?
language-agnostic variables groovy naming-conventions dynamic-typing
假设我获得了我作为一个类的名称String.如何使用该字符串中包含的名称实例化该类?我知道它将来自某个父类,但实际的类会有所不同.
以下为什么不工作?(是的,我正在使用2.9.0final并打开" -Xexperimental "选项.)
implicit def any2Dynamic(a: Any) = new Dynamic {
def applyDynamic(name: String)(args: Any*) = {
println(a + name)
}
}
"Say".hello // value hello is not a member of java.lang.String
Run Code Online (Sandbox Code Playgroud)
人们可以争论这是多么有意义......如果这将按预期工作,优先权将发生在"Say".toInt:StringLike.toInt或(new Dynamic {...}).applyDynamic("toInt")?
当我遇到一个有趣的问题时,我正在为D实现一个动态类型库.
现在,我成功地创建了一个函数dynamic(),该函数返回一个对象的动态版本.
例如:
import std.stdio, std.dynamic.core;
class Foo
{
string bar(string a) { return a ~ "OMG"; }
int opUnary(string s)() if (s == "-") { return 0; }
}
void main(string[] argv)
{
Dynamic d = dynamic(new Foo());
Dynamic result = d.bar("hi");
writeln(result); // Uh-oh
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是writeln尝试使用编译时反射来弄清楚如何对待result.
它尝试的第一件事是什么? isInputRange!(typeof(result))
麻烦的是,它返回真实!为什么?因为我必须假设它所需要的所有成员都存在,除非我能在运行时证明这一点 - 这为时已晚.因此,该程序试图调用front,popFront以及empty上result,撞毁我的程序.
我想不出办法解决这个问题.有没有人有想法?
假设我有一个抽象基类Parent和子类Child1和Child2.如果我有一个函数,接受家长*,是有办法(或许与RTTI?)在运行时,以确定它是否是一个Child1*或*CHILD2的功能实际收到?
到目前为止,我在RTTI的经验是,当foo是Parent*时,typeid(foo)返回typeid(Parent*),而不管foo是其成员的子类.
我知道这不起作用,但有没有人有办法使它工作?
object obj = new object();
MyType typObj = new MyType();
obj = typObj;
Type objType = typObj.GetType();
List<objType> list = new List<objType>();
list.add((objType) obj);
Run Code Online (Sandbox Code Playgroud)
编辑:
这是当前的代码:http://github.com/vimae/Nisme/blob/4aa18943214a7fd4ec6585384d167b10f0f81029/Lala.API/XmlParser.cs
我试图简化的方法是SingleNodeCollection
正如您所看到的,它目前使用了如此混乱的反射方法.
我习惯于动态类型,这意味着在运行时检查对象/非面向对象结构的类型信息并抛出某种类型的错误,即如果它像鸭子那样呱呱叫它.是否有不同类型的动态类型(请详细说明).
我正在使用一个抽象工厂来返回具体子类的实例.我想在给定具体类名的String的情况下在运行时实例化子类.我还需要将参数传递给构造函数.类结构如下:
abstract class Parent {
private static HashMap<String, Child> instances = new HashMap<String,Child>()
private Object constructorParameter;
public static Child factory(String childName, Object constructorParam){
if(instances.keyExists(childName)){
return instances.get(childName);
}
//Some code here to instantiate the Child using constructorParam,
//then save Child into the HashMap, and then return the Child.
//Currently, I am doing:
Child instance = (Child) Class.forName(childClass).getConstructor().newInstance(new Object[] {constructorParam});
instances.put(childName, instance);
return instance;
}
//Constructor is protected so unrelated classes can't instantiate
protected Parent(Object param){
constructorParameter = param;
}
}//end Parent …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
MyClass here = new MyClass();
IEnumerable<MyClass> vats = (IEnumerable<MyClass>)here.All();
Run Code Online (Sandbox Code Playgroud)
All()方法返回IEnumerable <dynamic>.我想将其转换为IEnumerable <MyClass>.上面的行没有工作,它说无法将'd__15'类型的对象强制转换为'System.Collections.Generic.IEnumerable`1 [MyClass]'.
我也尝试过:
IEnumerable<MyClass> vats = here.All() as IEnumerable<MyClass>;
Run Code Online (Sandbox Code Playgroud)
但它返回null.
我看到这一小段代码正在逃避我的理解:
<?php
$a = '0e462097431906509019562988736854';
$b = '0e830400451993494058024219903391';
var_dump($a == $b);
Run Code Online (Sandbox Code Playgroud)
哪个会输出:
bool(true)
Run Code Online (Sandbox Code Playgroud)
据我所知,使用==PHP时会尝试进行模糊比较,在类型之间进行静默转换以执行比较.我不理解的是为什么PHP似乎认为这两个字符串是相同的.我会想到,因为$a并且$b是字符串,所以不需要进行类型转换.
我不明白的是什么?
dynamic-typing ×10
c# ×2
c++ ×1
d ×1
duck-typing ×1
dynamictype ×1
groovy ×1
haxe ×1
java ×1
php ×1
scala ×1
variables ×1