k****t 发帖数: 12697 | 1 I don't put much faith on the sina tests. Too shan zai.
UV(N) is targeted in southeast asia market only with a different type of
glass (some said inferier). Not available in NA and EU.
Light loss of Nikon and Canon are only 0.1~0.2%? LOL |
|
t***k 发帖数: 30 | 2 http://www.psychologytoday.com
Therapy methods abound. But which will work best for you? Here's a list:
Adlerian
Adlerian psychotherapy was founded by Alfred Adler (an ex-associate of Freud
who rejected Freud's notion that sex is the root of all psychological
problems.) It takes a positve view of human nature: We are all goal-oriented
creatures who are striving for social connectedness, and we are in control
of our destiny. Many personal difficulties, Adler believed, stem from
feelings of inferi |
|
q*c 发帖数: 9453 | 3 程序员的工作已经够麻烦了,大家觉得发明这个 type inference, 不清楚的表明,而
是让编译器和人脑从上下文思考推断类型,是个啥思维方式?
难道觉得人类的智慧过于强大无处使用了嘛?
我是非常的厌恶这些恶心无比的奇技淫巧,除了节省几百万分之一分钱的内存和银盘,
消耗宝贵的脑力,毫无意义。 |
|
X****r 发帖数: 3557 | 4 这个倒也不能一概而论。表达简洁对读程序还是有帮助的。毕竟一段程序被读的次数往
往远远大于被写和改写的次数,而大部分读者只是泛泛而读,不需要细抠每一个变量类
型。当然这里面的得失就见仁见智了。 |
|
q*c 发帖数: 9453 | 5 表达简介的含义是,便于阅读吧? 而不是字数少?
要说字数, 广义相对论那几篇论文的表达比凡人修仙传 简介了不知道多少,不得不读
的话,你喜
欢读哪个? 呵呵。 |
|
q*c 发帖数: 9453 | 6 而且读程序的时候,哪怕有牛逼编辑器的帮助,四处乱跳找类型,记住,再跳回来,那
是及其的破坏思维连贯性。 |
|
X****r 发帖数: 3557 | 7 我说的就是对于大部分读者不需要关心每个表达式或是变量的具体类型信息。大概知道
是做什么就行。 |
|
L*****e 发帖数: 8347 | 8 Type inference和dynamic type不是一回事,正确使用是节省脑力(对编译器的影响更
是近似于0)。
首先,使用type inference不算“不清楚表明type”,它的type在initialize的
statement的时候确定了。所谓的“根据上下文思考推断类型”只是看右边赋值的type
。你使用type reference的时候不一样要看右边赋值的type?
在右边赋值type套有多层namespace的时候,使用type inference可以节省脑力担心两
边type不match并使code简洁。两边type不match时造成编译错误也就罢了,如果右边
type正好继承左边type,就悄悄地把非有意的type convert bug带进来了。
另外,在refactor的时候type inference也有一定好处,比如说你有一段code:int
maxNum = getMaxNum();本来getMaxNum()是return int,但是某一天refactor,
getMaxNum return long 或者 double了,你还要回去改maxNum的... 阅读全帖 |
|
L*****e 发帖数: 8347 | 9 你说的四处乱跳找类型说明了没有正确使用type inference,一般type inference用在
local variable,如果不是local variable,declare 和initialize最好在一个
statement上,只要看一下=右边啥type就知道了。。。
★ 发自iPhone App: ChineseWeb 8.2.2 |
|
N********n 发帖数: 8363 | 10
高级语言啥用?汇编多好,把机器内部的指令和内存细节都搞清楚了。用
高级语言来掩盖这些内容是毫无意义。 |
|
q*c 发帖数: 9453 | 11 这个可不一定,比如 scala 里面的 map. 你知道那是什么变量?取决于 map 那个
collection. 那个 collection 经常是个其他函数返回的,其他函数又可能是其他函数
以及各种 map 隐含返回的。
你就慢慢inference去吧,,工作? 以后再说, 呵呵。等你费劲搞清楚了,改好了,
下个倒霉的需要维护这些东西的, 再来一遍,再来一遍。 你下次?忘了, 再来。
type |
|
|
L*****e 发帖数: 8347 | 13 哦,我上面的话基本上是针对C#说的,C++的auto大概也类似。我对Scala不懂,不过
Scala的易读性本来就有点臭名昭著吧?
★ 发自iPhone App: ChineseWeb 8.2.2 |
|
X****r 发帖数: 3557 | 14 几个字符当然没问题,不过实际情况是经常会多写几十个字符,甚至几行。 |
|
k**********g 发帖数: 989 | 15
I don't recommend using auto for collections. Use auto for the iterators and
const_iterators. These dependent template types have long names and had
always been a hassle without adding much useful information.
A complete sequential traversal should just use the range-based for. Keep
the code simple, stu. |
|
X****r 发帖数: 3557 | 16 前面说了type inference的(稍许)好处,其实我个人而言并不喜欢这个特性。我觉得
语言应该简单,应该只包含重要的特性,大多数情况下作某件事情应该只有一种方法。
任何多余的特性都会增加学习语言和阅读代码的代价,而且它一定会被误用。不过许多
人显然不这么认为。 |
|
g*****g 发帖数: 34805 | 17 不能同意更多。适当的语法糖是好的,过多就产生了一个东西 N种写法的问题。 |
|
t****t 发帖数: 6806 | 18 举个例子说
vector a;
你觉得
for (vector::iterator i=a.begin(); i!=a.end(); i++) {...}
还是
for (auto i=a.begin(); i!=a.end(); i++) {...}
比较清楚?
我觉得后面那个比较清楚易懂. |
|
s***o 发帖数: 2191 | 19 我觉得这个例子正好说明type inference的好处 - 很多时候你并不关心中间变量的类
型,扔个val/var过去就不用一层层扒皮找答案了。
C#中,有时必须使用var,比如处理anonymous type时。没研究过Scala的type
inference是否只是syntax sugar。 |
|
d****i 发帖数: 4809 | 20 支持好虫和楼上几位的观点,语言增加一些不必要的语法糖,有百害而无一益,
verbose一点又有什么关系,更清楚明了,让初学者概念清晰,不要去追求奇技淫巧。
所以C++11某些添加的东西显然是走在错误的道路上,比如auto这个东西,本身就是和C
的auto变量产生歧义冲突。 |
|
d****i 发帖数: 4809 | 21 你如果把for loop里面的东西另起一行,显然这种写法概念更清楚,否则让人不知道it
是个iterator变量
vector::iterator it;
for(it = a.begin(); i != a.end(); i++) |
|
L*****e 发帖数: 8347 | 22 不知道你如何定义“不必要的语法糖”,起码对这个type inference,我觉得和“茴香
豆的茴有四种写法的问题是不一样的。上面大家也指出了type inference对代码的易读
性,是否容易引入bug,是否更容易refactor维护都有影响,在LINQ里,使用anonymous
type更是必不可少,type inference也就变得必不可少。
当然,如果不正确使用,确实是会带来比不用更多问题,给初学者带来更大的learning
curve。但是这就像学习自然语言里的近义词一样,小学生初学时会在句子里不很适当
地使用,但不能因为小学生学习时可能会误用,就剔除语言里所有的近义词。。。
和C
★ 发自iPhone App: ChineseWeb 8.2.2 |
|
k**********g 发帖数: 989 | 23
it
In C++11, if you need to enumerate the entire collection in the natural
order, there's no need to use iterator explicitly. Just loop over a
reference to the values.
vector < myobject > vec ;
for (const myobject & : vec ) { /* do stuff */ }
(space inserted to prevent MITBBS clobbering)
Similar argument applies to "auto" variable. |
|
o**o 发帖数: 3964 | 24 这一类的特效引入本质上是为了增加门槛高度,但是打着functional language简介优
美的旗号。这样的狗屁让code变短,给debug带来无穷麻烦,却不增加任何执行效率。
打字的时候少几行字符,跟回头纠错维护消耗的时间,根本就是九牛一毛。 |
|
v******n 发帖数: 421 | 25 如果编辑器够牛,不用跳来跳去,鼠标放上去也应该可以显示类型 |
|
d*******r 发帖数: 3299 | 26 对于这个问题,我觉得比较好的解决方案是:
就是 editor/IDE 和 一个语言应该是绑定在一起的, 一起设计出来的。
这样定义变量的时候,大家如果想少敲几个字,editor/IDE 会自动帮你补全,
比如你敲入 var m = {'key1': 1, 'key2':2};
editor/IDE 就半自动地补全成 map m = {'key1': 1, 'key2':2};
就是给你几个类型定义,让你一定要选一个, 这个快捷键操作也很快的。
然后读代码的时候,如果你想略去类型信息,就想读 Python 哪种伪代码的简洁代码 (
这样有时对于理解程序主要idea,还是很有用的). 你可以让 editor/IDE 隐藏 部分/
全部 代码的 (特别是冗长的) 类型信息.
这样就比较理想了。如果我要设计一门语言,我一定连同 editor/IDE 的核心功能一起
设计. |
|
p**o 发帖数: 3409 | 27 到处声明类型的确比较臃肿;但全部duck typing很难做local reasoning,我大脑常常
栈溢出。这跟写代码的人的水平关系很大。高质量的Python代码读起来比高质量的Java
代码愉快十倍;但Python烂代码读起来比Java烂代码痛苦一百倍,常常只能推倒重写。
我觉得在函数签名上有选择地做类型标注或者声明、函数内部不做声明,是比较好的折
中。
Python3的function annotations特性很受欢迎,虽然只是标注而没有影响语义。mypy
是个有意思的python编译器和虚拟机,利用这个特性做static typing,也就是说在语
法跟python(基本)相同,但语义上是python的超集。
http://mypy-lang.org/
( |
|
q*c 发帖数: 9453 | 28 问题是只要你允许,早晚人一定滥用。
历史反复证明了这一点。。
and |
|
q*c 发帖数: 9453 | 29 当我在循环体里面要操作 i 的时候, 前面这个就清楚了。 |
|
t****t 发帖数: 6806 | 30 另起一行根本就不合C++的习惯.
况且在这里自动类型推断其实是减少了代码重复. 比如说我写到后面想要换一个contai
ner, 不用vector改用deque了, 这些衍生的变量就不用改了. 用在模板里也很清楚.
anyway, 这个事情我觉得说这个意思不大, 板上争论过不止一回两回了. 很多事情都能
被滥用的.
it |
|
|
|
l*********s 发帖数: 5409 | 33 连auto也算滥用?我觉得这个说法就和说会写atoi就是算法大牛一样 --- 门槛太低了。 |
|
l*********s 发帖数: 5409 | 34 re,这玩意都要上纲上线,纯属吃饱了撑的
contai |
|
c*******9 发帖数: 9032 | 35 俺宁愿读广相,也读不下去凡人修仙传。修仙体裁我喜欢,但这个实在垃圾。 |
|
c*******9 发帖数: 9032 | 36 小程序多写几行没什么,程序大了,行数很影响查找阅读效率。精炼一些不一定导致多
bug.提高一点点门槛对高级程序员来说是有利的。
it |
|
n****1 发帖数: 1136 | 37 楼主没明白type inference的在fp里的必要性。 事实是如果没有type inference, FP
寸步难行
C/Java系列的写个声明是有必要是因为:
1. 类型相对静态, 变量总个数>>类型总个数
2. 同一变量跨度相对比较大, 尤其是很多上千行的程序, 变量声明都在第一页, 然
后分布在各个角落里, 没有声明是不行的。
FP风格恰好相反:因为函数是first class citizen, 所以类型的数量成指数型增长,
需要表达该类型的声明也越来越长。 而在整个程序中, 可能只有一个常量是这种类型
。 也就是说常量总个数~=类型总个数。 如果每定义一个常量都写个声明, 那声明会
远远长过代码本身。
还有就是FP里用到了type inference的常量一般是局部值,跨度很少超过5行的。 这样
的不写声明也不会难以理解, 写的话反而叫滥用生命。
C++的auto的却有争议, auto最好只用来表达const auto或者iterator这些容易推理的
值。 |
|
|
p*****w 发帖数: 429 | 39 你们能不能先定义一下语言,statically typed languages有type inference. 和
dynamically typed languages的type inference就不一样.不分语言就这么讨论太糊涂
了.
type
,而
盘, |
|
L*****e 发帖数: 8347 | 40 当然是在说statically typed language了。type inference和dynamic type根本就不
是一回事,type inference的type依然是在compile time时确定的,所以dynamically
typed language就不存在type inference的概念。。。
★ 发自iPhone App: ChineseWeb 8.2.2 |
|
p**o 发帖数: 3409 | 41 因为现代虚拟机的发展,compile time和run time的区分已经越来越模糊了,所以以此
为区分的static typing和dynamic typing也在融合。在实际使用中,一个需要在
runtime才定类型、但可以经由JIT充分加速的语言,与一个虽然在compile time可以由
机器推导定类型、但平均水平的人脑很难在局部迅速做出类型判断的语言,在运行性能
、代码可读性、重构的灵活性这三个实质性指标上没有什么不同。
dynamically |
|
a*********a 发帖数: 3656 | 42 if you v done some semi-serious metaprogramming, you ll thank type inference
to no end. |
|
k**********g 发帖数: 989 | 43
inference
所以才有 decltype 。因为写 meta programming 的大牛们忿怒了。 |
|
|
m******c 发帖数: 568 | 45 HP is always the best no matter what!!!
a horde of inferi inside the seaside cave. so scary!!!!! |
|