假设我们有一个返回一些值和错误的函数。处理错误和值声明的首选方式是什么?
func example_a(data interface{}) (interface{}, error) {
var err error
var bytes []byte
if bytes, err = json.Marshal(data); err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
func example_b(data interface{}) (interface{}, error) {
if bytes, err := json.Marshal(data); err != nil {
return nil, err
} else {
// ...
return use(bytes), nil
}
}
func example_c(data interface{}) (result interface{}, err error) {
var bytes []byte
if bytes, err = json.Marshal(data); err != nil {
return
}
// ...
return use(bytes), nil
}
func example_d(data interface{}) (interface{}, error) {
bytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
func example_dream(data interface{}) (interface{}, error) {
if bytes, err ≡ json.Marshal(data); err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
Example A 很清楚,但它增加了 2 行。此外,我发现不清楚为什么在这种特殊情况下我们应该使用 var,同时 := 并不总是合适的。然后你想在行的某个地方重用 err 声明,我不喜欢拆分声明和赋值。
Example B 使用了 if-declare-test 语言特性,我认为这是值得鼓励的,但同时你被迫嵌套函数继续,违反了快乐路径原则,这也是受到鼓励。
示例 C 使用命名参数返回功能,它介于 A 和 B 之间。这里最大的问题是,如果您的代码库使用样式 B 和 C,那么很容易出错 := 和 =,这可能会导致各种问题。
示例 D(从建议中添加)对我来说有与 C 相同的使用问题,因为我不可避免地会遇到以下问题:
func example_d(a, b interface{}) (interface{}, error) {
bytes, err := json.Marshal(a)
if err != nil {
return nil, err
}
bytes, err := json.Marshal(b) //Compilation ERROR
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
因此,根据之前的声明,我必须修改我的代码以使用 := 或 =,这使得查看和重构变得更加困难。
Example Dream 是我直觉上对 GO 的期望——没有嵌套,快速退出,没有太多冗长和变量重用。显然它无法编译。
通常 use() 被内联并多次重复该模式,从而加剧了嵌套或拆分声明问题。
那么处理这种多重返回和声明的最惯用的方法是什么?有没有我遗漏的模式?
最佳答案
如果您查看大量 Go 代码,您会发现以下是常见的情况:
func example(data interface{}) (interface{}, error) {
bytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
declare and test if 结构在它的位置上很好,但它通常不适合这里。
关于go - 惯用语 Go Happy Path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46024818/
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol
我是Ruby的新手,发现以下几对令人困惑示例同样有效:File.included_modulesFile::included_modulesFile.stat('mbox')#Returnsa'#'objectFile::stat('mbox')File.new("foo.txt","w")File::new("foo.txt","w")"asdf".size#Aninstancemethod"asdf"::size2+32::send(:+,3)#AnextremeexampleFile::new,尤其是我经常遇到的东西。我的问题:如果我永远避免使用::运算符来限定除类、模块和常量之
这是我正在尝试做的事情的本质,但“中断”不正确:needle=nilhaystacks.eachdo|haystack|needle=haystack.look_for_needle()breakifneedleend这更短,但它会遍历每个干草堆(至少不看),即使它不需要:needle=nilhaystacks.eachdo|haystack|needle||=haystack.look_for_needle()end这是一个单行代码,但(我相信)它并不懒惰,所以它做了不必要的工作:needle=hackstacks.map{|h|h.look_for_needle()}.detect
我的应用程序中有许多多行ActiveRelation查询方法,我不确定编写这些方法的最惯用方式。看看这个例子:defpostal_code_ids_within(miles)nearby_postal_codes=PostalCode.where("latitude>:min_latandlatitude:min_lonandlongitude我觉得有点不对劲。从中返回ActiveRelation对象的block似乎是惯用的,但我还没有看到这种方法。什么是标准? 最佳答案 根据Brian的建议,这更易读并且效果很好。scope:ne
给定一个Ruby数组ary1,我想生成另一个数组ary2,它具有与ary1相同的元素,除了那些在一组给定的ary1索引处。我可以将这个功能猴子修补到Ruby的Array类上classArraydefreject_at(*indices)copy=Array.new(self)indices.uniq.sort.reverse_eachdo|i|copy.delete_atiendreturncopyendend然后我可以像这样使用它:ary1=[:a,:b,:c,:d,:e]ary2=ary1.reject_at(2,4)puts(ary2.to_s)#[:a,:b,:d]虽然这很好用
假设我想使用Proc描述Kernel.puts。我该怎么做?我能想到很多可能性;Proc.newdo|*args|Kernel.puts*argsend:puts.to_proc.curry[Kernel]#doesn'twork,returns`nil`asputsisvarargs但是两者都非常冗长。 最佳答案 method是您要找的吗?它可以让您将方法保存到变量。2.1.0:003>m=Kernel.method(:puts)=>#2.1.0:004>m.call('hi')hi
自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例
这似乎是一个非常简单的问题,但是用Ruby重写它的最短/最惯用的方法是什么?ifvariable==:aorvariable==:borvariable==:corvariable==:d#etc.我看到了这个解决方案:if[:a,:b,:c,:d].include?variable但这在功能上并不总是等价的-我相信Array#include?实际上是在查看变量对象是否包含在列表中;它没有考虑到对象可以使用def==(other)实现自己的相等性测试。正如下面有帮助的评论员所说,这种解释是不正确的。include?确实使用==但它使用数组中项目的==方法。在我的示例中,它是符号,而不是
我有一个对象数组,其中一些响应:description,我想从第一个对象中获取真实描述的描述。我可以这样做:objects.detect{|o|o.try(:description)}.description或者这个:objects.map{|o|o.try(:description)}.detect{|o|o}但第一个不是DRY(描述在那里两次),第二个在找到值之前遍历整个数组。ruby标准库或Rails的扩展中是否有任何东西可以让我做这样的事情:objects.detect_and_return{|o|o.try(:description)}我知道我可以很容易地编写它,但标准库足够