那些真正懂得如何利用动态编程语言的人如何以不同于使用静态语言工作的人来编程?
我对静态与动态类型的整个争论很熟悉,但这不是我所得到的.我想讨论在动态语言中实用但在静态语言中不实用的问题解决技术.
我在动态编程语言中编写的大多数代码与用静态编程语言编写的代码差别不大.俗话说,你可以用任何语言写FORTRAN,很多人都这样做.但有些人使用动态编程语言以一种不易转换为C++的方式解决问题.他们的一些技术是什么?
讨论如何使用动态编程语言的一些好资源是什么?不是关于语言语法或API参考的书籍,而是关于利用动态语言功能的问题解决方法的资源.
编辑(2009年1月5日):我很欣赏下面的答案,但它们似乎并没有说明动态语言倡导者说他们所经历的生产力的巨大提升.
当C#4.0出来时,我们有动态关键字,如Anders Hejlsberg在这个优秀的演示文稿中所描述的那样(C#的发展速度超过了我能跟上的速度......我没有太多时间熟悉var关键字)
我还需要var关键字吗?var有什么可以做的......动态不能吗?
var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
Run Code Online (Sandbox Code Playgroud) 在像Java这样的静态语言中,你需要接口,否则类型系统就不会让你做某些事情.但是在PHP和Python这样的动态语言中,你只需要利用duck-typing.
PHP支持接口.Ruby和Python没有它们.所以你可以在没有他们的情况下幸福地生活.
我一直在用PHP工作,并且从未真正使用定义接口的能力.当我需要一组类来实现某些通用接口时,我只是在文档中描述它.
所以你怎么看?如果不使用动态语言中的接口,你最好不是最好的吗?
我正在探索开发新系统(Web应用程序)的几种可能性.
我是一个"老式的"有点人,在自然界中面向对象(多年前从程序转换而来).我玩过Python并学习了一点Ruby,但坦率地说,我被吸引回使用微软的工具(C#,ASP.NET MVC).所有这些运行时类型,基本内容上没有编译器错误等等,只会让我在构建大型复杂应用程序时更加艰难.
我经常听到人们谈论你可以用动态语言做的伟大的事情,但除了狗,猫以及你能用多快的代码编写一个很酷的方式来计算事物的例子,Visual Studio的"工业实力"似乎消除了那些动态语言提供的整洁小东西,特别是现在您有免费的快速版本的VS和完整版本可供初创公司免费使用.
我觉得我在这里遗漏了一些东西,因为大型应用程序确实是用动态语言开发的,那么在查看大型复杂应用程序时,这些语言能让你做些什么呢?什么能让你放弃VS的力量?
我想这可以适用于任何动态语言,但我使用的是JavaScript.我们有一种情况,我们在JavaScript中编写了一些需要公开Send()函数的控件,然后由承载JavaScript的页面调用该函数.我们有一个定义了此Send函数的对象数组,因此我们遍历集合并在每个对象上调用Send().
在OO语言中,如果你想做类似的事情,你会有一个IControl接口,它有一个必须由每个控件实现的Send()函数,然后你有一个你要迭代的IControl实现的集合通过并调用send方法.
我的问题是,JavaScript是一种动态语言,是否需要定义控件应该继承的接口,还是只需要调用控件上公开的Send()函数就足够了?
我已经在C#中积极开发了好几年了.我主要在.NET堆栈上构建企业应用程序和内部框架.
我从来没有必要使用除C#之外的任何其他主流高级语言来完成我的任务,因为.NET是我们使用的标准平台.
有一些遗留的Python应用程序我被要求继续支持,我一般都没有接触python和动态语言(尽管我已经完成了一些JavaScript).
我希望得到一些指导/建议来帮助学习如何为静态类型的头脑学习像python这样的语言.
编辑:使用IronPython不是一个选择!
我希望Ruby的消息传递基础设施意味着可能有一些聪明的技巧.
如何确定调用对象 - 哪个对象称为我当前所使用的方法?
当我想在javascript中使用从其他地方提供的参数调用函数时,我可以使用apply函数的方法,如:
array = ["arg1", 5, "arg3"]
...
someFunc.apply(null, array);
Run Code Online (Sandbox Code Playgroud)
但是如果我需要以类似的方式调用构造函数呢?这似乎不起作用:
array = ["arg1", 5, "arg3"]
...
someConstructor.apply({}, array);
Run Code Online (Sandbox Code Playgroud)
至少不是我在尝试:
template = ['string1', string2, 'etc'];
var resultTpl = Ext.XTemplate.apply({}, template);
Run Code Online (Sandbox Code Playgroud)
这不起作用:
Ext.XTemplate.prototype.constructor.apply({}, template);
Run Code Online (Sandbox Code Playgroud)
有什么办法使这个工作吗?(在这个特殊情况下,我发现它new Ext.XTemplate(template)会起作用,但我对一般情况感兴趣)
类似的问题,但特定于内置类型,没有我可以使用的答案: 通过调用prototype.constructor.apply实例化JavaScript对象
谢谢.
时间已经过去,ES6和转换器现在已成为一件事.在ES6中,做我想做的事是微不足道的:new someConstructor(...array).
Babel会将其转换为ES5 new (Function.prototype.bind.apply(someConstructor, [null].concat(array)))();,如何构建JavaScript对象(使用'apply')中进行了解释?.
是不是因为动态类型我们不需要python中的接口概念(比如Java和C#)?
c# ×3
interface ×2
javascript ×2
python ×2
.net ×1
c#-4.0 ×1
duck-typing ×1
java ×1
messaging ×1
oop ×1
optimization ×1
php ×1
ruby ×1