在'惯用'Scala中表达此功能有哪些想法.或者更确切地说,有没有办法在不牺牲可读性的情况下删除本地变量?
def solve(threshold: Int)(f: Int => Int): Int = {
var sum = 0
var curr = 0
while(sum < threshold) {
sum += f(curr)
curr += 1
}
curr
}
Run Code Online (Sandbox Code Playgroud)
我唯一想到的就是这个,但在我看来它更长,更不易读.
def solve2(threshold: Int)(f: Int => Int): Int = {
val resultIterator = Iterator.iterate (0, 0) { case (curr, sum) =>
(curr + 1, sum + f(curr))
}
(resultIterator find (_._2 >= threshold)).get._1
}
Run Code Online (Sandbox Code Playgroud) 在OCaml中,可以通过引发异常提前退出命令式循环.
虽然在OCaml中使用命令式循环本身并不是惯用语,但我想知道在早期退出时模拟命令式循环的最惯用方法是什么(考虑到性能等方面,如果可能的话).
例如,旧的OCaml FAQ提到例外Exit:
Exit:用于跳出循环或函数.
它仍然是最新的吗?该标准库简单地提到它作为一个通用的异常:
该
Exit异常没有被任何库函数提高.它可以在您的程序中使用.
与此相关,这个回答另外一个问题提到使用预计算let exit = Exit例外,以避免在循环中分配.它还需要吗?
此外,有时人们想要从具有特定值的循环中退出,例如raise (Leave 42).是否有惯用的例外或命名约定来执行此操作?在这种情况下我应该使用引用(例如let res = ref -1 in ... <loop body> ... res := 42; raise Exit)吗?
最后,Exit在嵌套循环中的使用可以防止某些人想要退出几个循环的情况,比如break <label>在Java中.这将需要定义具有不同名称的异常,或者至少使用整数来指示应退出多少范围(例如Leave 2,指示应退出2个级别).同样,这里有一个惯用的方法/异常命名吗?
我被问到这个问题我不知道为什么.
如果你有一个指针int * x;
可以比拟的指针>和<,因为它代表的内存位置类似0x0000 0x0004 0x0008,等我知道迭代器和指针是不同的,但他们以非常相似的方式行事.
例如:
vector<int> myVector;
for(int i = 1; i < 101; i++)
{
myVector.push_back(i);
}
vector<int>::iterator it = myVector.begin();
while(it != myVector.end()) //Why can't we write it < myVector.end()
{
cout << *it << endl;
it++;
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能< myVector.end()在while声明中写出来?我知道这与STL中没有超载有关.然而,写作是&*it < &*myVector.end()有效的,因为它获得了显示说话的内存位置0x0004 0x0008等.
为什么是这样?
C++ 17将包括std::byte一种用于一个可原子寻址的存储器单元的类型,在典型的计算机上具有8位.
在这种标准化之前,指向"原始"内存时已经存在一些困境 - 在一方面使用char*/ unsigned char*另一方面void *.现在,void *删除了偏好的原因之一- std::byte没有与a相同的内涵char; 它是关于原始内存,而不是字符.
所以,我的问题是:什么是一个很好的经验法则std::byte,关于何时更喜欢它void *以及什么时候相反?
当然,当你处理旧代码或C代码时,你会受到它所接受的约束; 我主要是指新代码,您可以选择所有类型.
这里简单的问题是Clojure.处理字符串时哪个更惯用?在处理其他数据类型时哪个更惯用?哪个更有效率?
(drop 1 str)
Run Code Online (Sandbox Code Playgroud)
要么
(rest str)
Run Code Online (Sandbox Code Playgroud) 我已经:use在clojure中看到了几种不同的方法- 什么是惯用/首选方法?
#1
(ns namespace.core
(:use [[something.core]
[another.core]]))
Run Code Online (Sandbox Code Playgroud)
或#2编辑:与此一起使用:only.
(ns namespace.core
(:use [something.core]
[another.core]))
Run Code Online (Sandbox Code Playgroud)
或#3
(ns namespace.core
(:use [something.core
another.core]))
Run Code Online (Sandbox Code Playgroud)
或#4
(ns namespace.core
(:use (something.core
another.core)))
Run Code Online (Sandbox Code Playgroud)
或#5编辑:这是惯用的,但应该:use像#2一样使用
(ns namespace.core
(:use something.core
another.core))
Run Code Online (Sandbox Code Playgroud) 在我的Symfony 2应用程序中,我想使用标准的用户和角色授权系统(http://symfony.com/doc/2.0/book/security.html)
我的用户是存储在具有doctrine(实现用户界面)的数据库中的实体.我将在我的系统中有5个预定义角色,每个用户可能有多个这些角色.
实现这一目标的最惯用方法是什么?我在考虑以下三种解决方案.
创建单独的Role实体并与用户实体创建多对多关系
在用户中有一个字段,它是一个排序的逗号分隔的角色列表,getRoles()实现为 explode(',',this.all_roles)
每个角色的用户实体中有5个二进制字段
实现这个系统最常用的方法是什么?
如何else在惯用的Python for循环中使用语句?没有else我可以写例如:
res = [i for i in [1,2,3,4,5] if i < 4]
Run Code Online (Sandbox Code Playgroud)
结果是: [1, 2, 3]
上述代码的正常形式是:
res = []
for i in [1,2,3,4,5]:
if i < 4:
res.append(i)
Run Code Online (Sandbox Code Playgroud)
结果与惯用形式相同: [1, 2, 3]
我想要这个:
res = [i for i in [1,2,3,4,5] if i < 4 else 0]
Run Code Online (Sandbox Code Playgroud)
我得到SyntaxError: invalid syntax.结果应该是:[1, 2, 3, 0, 0]
正常的代码是:
res = []
for i in [1,2,3,4,5]:
if i < 4:
res.append(i)
else:
res.append(0)
Run Code Online (Sandbox Code Playgroud)
结果是: [1, …
我刚刚意识到可以在一个语句中进行映射查找和类型/接口断言.
m := map[string]interface{}{
"key": "the value",
}
if value, ok := m["key"].(string); ok {
fmt.Printf("value exists and is a string: %s\n", value)
} else {
fmt.Println("value does not exist or is not a string")
}
Run Code Online (Sandbox Code Playgroud)
这被认为是坏事吗?我没有看到任何官方文件评论这一点.
编辑:我知道这段代码无法区分"密钥不存在"和"值是不正确的类型".
edit2:ahem,else子句中的print是不正确的:(
在Statistics课程中,我的老师向我们展示了两个骰子的所有可能卷的概率模型,增加到4.记住Haskell列表推导非常棒,我决定将它带到下一步并编写此代码以查找所有可能增加10个骰子的4个骰子:
[(d1,d2,d3,d4) | d1 <- [1..6], d2 <- [1..6], d3 <- [1..6], d4 <- [1..6], (d1 + d2 + d3 + d4) == 10]
这按预期工作,给我输出
[(1,1,2,6),(1,1,3,5),(1,1,4,4),(1,1,5,3),(1,1,6,2) ,(1,2,1,6),(1,2,2,5),(1,2,3,4),(1,2,4,3),(1,2,5,2) ,(1,2,6,1),(1,3,1,5),(1,3,2,4),(1,3,3,3-),(1,3,4,2) ,(1,3,5,1),(1,4,1,4),(1,4,2,3),(1,4,3,2),(1,4,4,1) ,(1,5,1,3),(1,5,2,2),(1,5,3,1),(1,6,1,2),(1,6,2,1) ,(2,1,1,6),(2,1,2,5),(2,1,3,4),(2,1,4,3),(2,1,5,2) ,(2,1,6,1),(2,2,1,5),(2,2,2,4),(2,2,3,3),(2,2,4,2) ,(2,2,5,1),(2,3,1,4),(2,3,2,3),(2,3,3,2),(2,3,4,1) ,(2,4,1,3),(2,4,2,2),(2,4,3,1),(2,5,1,2),(2,5,2,1) ,(2,6,1,1),(3,1,1,5),(3,1,2,4),(3,1,3,3),(3,1,4,2) ,(3,1,5,1),(3,2,1,4),(3,2,2,3),(3,2,3,2),(3,2,4,1) ,(3,3,1,3),(3,3,2,2),(3,3,3,1),(3,4,1,2),(3,4,2,1) ,(3,5,1,1),(4,1,1,4),(4,1,2,3),(4,1,3,2),(4,1,4,1) ,(4,2,1,3),(4,2,2,2),(4,2,3,1),(4,3,1,2),(4,3,2,1) ,(4,4,1,1),(5,1,1,3),(5,1,2,2),(5,1,3,1),(5,2,1,2) ,(5,2,2,1),(5,3,1,1),(6,1,1,2),(6,1,2,1),(6,2,1,1) ]
这就是我的问题所在.Ruby是我背景的重要组成部分,因此我对DRY原则非常重视.有d1 <- [1..6], d2 <- [1..6], d3 <- [1..6], d4 <- [1..6]在我的代码似乎没有必要,我愿意相信有一个更好的方式来做到这一点.
据我所知,我当前的方法通过在幕后运行4个嵌套循环来实现 - 每个生成器一个.有没有办法让一个<- [1..6]生成器适用于所有变量,有效地创建4个嵌套循环?如果没有,是否有更少冗余或惯用的方式编写此代码以实现相同的结果?
注意:我对这门语言很陌生,所以如果这是显而易见的话我会道歉.如果您使用任何新手命令式/面向对象程序员不熟悉的单词/概念,请尝试为我解释它们.