标签: idiomatic

从clojure中的常见lisp替换(null x)函数的惯用方法

在Common Lisp中,您使用(null x)函数来检查空列表和nil值.

大多数逻辑上这映射到

(or (nil?  x) (= '() x))
Run Code Online (Sandbox Code Playgroud)

在clojure.有人可以建议在Clojure中使用更惯用的方法吗?

lisp idiomatic clojure common-lisp

10
推荐指数
2
解决办法
1715
查看次数

循环条件在python中

考虑C中的以下代码:

for(int i=0; i<10 && some_condition; ++i){
    do_something();
}
Run Code Online (Sandbox Code Playgroud)

我想在Python中编写类似的东西.我能想到的最好的版本是:

i = 0
while some_condition and i<10:
    do_something()
    i+=1
Run Code Online (Sandbox Code Playgroud)

坦率地说,我不喜欢while模仿for循环的循环.这是由于忘记增加计数器变量的风险.另一个选择是增加这种风险:

for i in range(10):
    if not some_condition: break
    do_something()
Run Code Online (Sandbox Code Playgroud)

重要的澄清

  1. some_condition 并不意味着在循环期间计算,而是指定是否首先启动循环

  2. 我指的是Python2.6

哪种款式首选?有没有更好的成语呢?

python coding-style idioms idiomatic

10
推荐指数
2
解决办法
3万
查看次数

将def与val用于常量值有什么含义

在Scala 中使用defvs. val来定义一个常量的不可变值有什么含义?我显然可以写下面的内容:

val x = 3;
def y = 4;
var a = x + y; // 7
Run Code Online (Sandbox Code Playgroud)

这两个陈述之间有什么区别?哪一个表现更好/是推荐的方式/更惯用?我何时会使用一个而不是另一个?

scala function idiomatic immutability

10
推荐指数
1
解决办法
981
查看次数

10
推荐指数
1
解决办法
2600
查看次数

我应该尝试在Java中创建可逆枚举还是有更好的方法?

我似乎多次遇到这个问题,我想问社区我是不是只是在咆哮错误的树.基本上我的问题可以归结为:如果我有一个值很重要的枚举(在Java中),我应该使用枚举还是有更好的方法,如果我使用枚举那么什么是反向查找的最佳方法吗?

这是一个例子.假设我想创建一个代表特定月份和年份的bean.我可能会创建如下内容:

public interface MonthAndYear {
    Month getMonth();
    void setMonth(Month month);
    int getYear();
    void setYear(int year);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将我的月份存储为一个名为Month的单独类,因此它是类型安全的.如果我只是输入int,那么任何人都可以传入13或5,643或-100作为数字,并且在编译时无法检查它.我限制他们把一个月我将实现为枚举:

public enum Month {
    JANUARY,
    FEBRUARY,
    MARCH,
    APRIL,
    MAY,
    JUNE,
    JULY,
    AUGUST,
    SEPTEMBER,
    OCTOBER,
    NOVEMBER,
    DECEMBER;
}
Run Code Online (Sandbox Code Playgroud)

现在假设我有一些我想写的后端数据库,它只接受整数形式.那么标准的方法似乎是:

public enum Month {
    JANUARY(1),
    FEBRUARY(2),
    MARCH(3),
    APRIL(4),
    MAY(5),
    JUNE(6),
    JULY(7),
    AUGUST(8),
    SEPTEMBER(9),
    OCTOBER(10),
    NOVEMBER(11),
    DECEMBER(12);

    private int monthNum;
    public Month(int monthNum) {
        this.monthNum = monthNum;
    }

    public getMonthNum() {
        return monthNum;
    }
}
Run Code Online (Sandbox Code Playgroud)

相当简单,但如果我想从数据库中读取这些值并编写它们会发生什么?我可以使用枚举中的case语句实现一个静态函数,它接受一个int并返回相应的Month对象.但这意味着如果我改变了什么,那么我将不得不改变这个函数以及构造函数参数 - 在两个地方改变.所以这就是我一直在做的事情.首先,我创建了一个可逆的地图类,如下所示:

public class ReversibleHashMap<K,V> extends java.util.HashMap<K,V> {
    private …
Run Code Online (Sandbox Code Playgroud)

java enums idiomatic

9
推荐指数
1
解决办法
1469
查看次数

习惯用Scala处理基类vs派生类字段名称的方法?

考虑Scala中的以下基类和派生类:

    abstract class Base( val x : String )

    final class Derived( x : String ) extends Base( "Base's " + x )
    {
        override def toString = x
    }
Run Code Online (Sandbox Code Playgroud)

这里,Derived类参数的标识符'x'覆盖Base类的字段,因此调用toString如下:

    println( new Derived( "string" ).toString )
Run Code Online (Sandbox Code Playgroud)

返回Derived值并给出结果"string".

因此,对'x'参数的引用会提示编译器自动在Derived上生成一个字段,该字段在调用toString时提供.这通常非常方便,但会导致字段的复制(我现在将字段存储在Base和Derived上),这可能是不合需要的.为了避免这种复制,我可以将Derived类参数从'x'重命名为其他内容,例如'_x':

    abstract class Base( val x : String )

    final class Derived( _x : String ) extends Base( "Base's " + _x )
    {
        override def toString = x
    }
Run Code Online (Sandbox Code Playgroud)

现在调用toString返回"Base的字符串",这就是我想要的.不幸的是,代码现在看起来有些难看,使用命名参数来初始化类也变得不那么优雅了:

    new Derived( _x = "string" ) 
Run Code Online (Sandbox Code Playgroud)

还存在忘记给派生类的初始化参数赋予不同名称并且无意中引用错误字段的风险(因为Base类实际上可能保持不同的值,所以不合需要).

有没有更好的办法?

编辑1:为了澄清,我真的只想要Base值; 导出的只是初始化基类字段所必需的.该示例仅引用它们来说明随后出现的问题. …

scala field idiomatic

9
推荐指数
2
解决办法
3491
查看次数

基于密钥在数据框中聚合值

我有一段聚合代码,运行得很好,但对10e6行的数据帧运行有点慢.我不是那种经验丰富的R,所以为我那令人畏缩的代码道歉!

我只是想做一个基本的汇总和共同键的值的总和...

例如从...来

  key val
1   a   5
2   b   7
3   a   6
Run Code Online (Sandbox Code Playgroud)

至...

  key val
1   a   11
2   b   7
Run Code Online (Sandbox Code Playgroud)

我能管理的最好的是......

keys = unique(inp$key)
vals = sapply(keys, function(x) { sum(inp[inp$key==x,]$val) })
out = data.frame(key=keys, val=vals)
Run Code Online (Sandbox Code Playgroud)

我有这种直觉,认为这inp[inp$key==x,]不是最好的方法.是否有明显的加速我错过了?我可以在Hadoop中做到这一点(因为10e6数据集实际上已经是来自2e9行数据集的汇总)但我正在尝试改进我的R.

干杯,垫子

r idiomatic

9
推荐指数
2
解决办法
7706
查看次数

我应该使用Initialize-on-demand习语,如果是这样的话?

我有以下代码:

 MyType x = do_something_dangerous();
 // ...
 if (some_condition) {
     // ...
     bar(x);
 }
 else { 
     // ...
 }
 // ...
 if (another_condition_which_may_depend_on_previous_if_else} {
     // ...
     baz(x);
 }
Run Code Online (Sandbox Code Playgroud)

这个想法是,在某些情况下,我可能需要使用,这可能是事先确定的难度/不方便x.但是在我不需要使用它的情况下,尝试初始化它可能是不好的(比如说,可能会导致我的进程崩溃).

现在,似乎我需要使用的是一个初始化按需持有者(链接侧重于Java,所以这里是一个草图):某种Wrapper<MyType>Wrapper<MyType, do_something_dangerous>一种get()方法,这样第一次get()调用do_something_dangerous(),后来get()只是通过第一次通话获得的价值.

  • 这确实是一种合适的方法吗?
  • 是否有一些标准(ish)实现这个成语,或者它的一个变体?

笔记:

  • 我可以使用boost::optional,但这有点麻烦,也扭曲了预期的用途:"建议optional<T>在没有类型的价值,T缺乏的地方,只有一个,清楚(对所有各方)的原因使用价值与任何常规价值一样自然T."

c++ idioms idiomatic

9
推荐指数
1
解决办法
425
查看次数

HOWTO:用gtk(rust-gnome)回调的惯用Rust

我目前正在学习Rust,并希望用它来开发基于GUI的GTK +应用程序.我的问题涉及注册回调以响应GTK事件/信号并在这些回调中改变状态.我有一个工作但不优雅的解决方案,所以我想问一下是否有更清洁,更惯用的解决方案.

我已经将我的代码实现为具有方法实现的结构,其中结构维护对GTK小部件的引用以及它所需的其他状态.它构造一个传递给GtkWidget::connect*函数的闭包, 以便接收事件,绘制到画布等.这可能会导致借用检查器出现问题,我现在将解释.我有一些工作但(IMHO)非理想的代码,我将展示.

最初的非工作解决方案:

#![cfg_attr(not(feature = "gtk_3_10"), allow(unused_variables, unused_mut))]

extern crate gtk;
extern crate cairo;

use gtk::traits::*;
use gtk::signal::Inhibit;
use cairo::{Context, RectangleInt};


struct RenderingAPITestWindow {
    window: gtk::Window,
    drawing_area: gtk::DrawingArea,
    width: i32,
    height: i32
}

impl RenderingAPITestWindow {
    fn new(width: i32, height: i32) -> RenderingAPITestWindow {
        let window = gtk::Window::new(gtk::WindowType::TopLevel).unwrap();
        let drawing_area = gtk::DrawingArea::new().unwrap();
        drawing_area.set_size_request(width, height);
        window.set_title("Cairo API test");
        window.add(&drawing_area);

        let instance = RenderingAPITestWindow{window: window,
            drawing_area: drawing_area,
            width: width,
            height: height,
        };

        instance.drawing_area.connect_draw(|widget, cairo_context| …
Run Code Online (Sandbox Code Playgroud)

gtk idiomatic callback rust rust-gnome

9
推荐指数
1
解决办法
1577
查看次数

在F#中使用Option idiomatic吗?

我有以下函数检查customer数据源中a 的存在并返回id.这是使用该Option类型的正确/惯用方式吗?

let findCustomerId fname lname email = 
    let (==) (a:string) (b:string) = a.ToLower() = b.ToLower()
    let validFName name (cus:customer) =  name == cus.firstname
    let validLName name (cus:customer) =  name == cus.lastname
    let validEmail email (cus:customer) = email == cus.email
    let allCustomers = Data.Customers()
    let tryFind pred = allCustomers |> Seq.tryFind pred
    tryFind (fun cus -> validFName fname cus && validEmail email cus && validLName lname cus)
    |> function 
        | Some cus -> cus.id
        | None …
Run Code Online (Sandbox Code Playgroud)

f# idiomatic

9
推荐指数
4
解决办法
257
查看次数

标签 统计

idiomatic ×10

idioms ×3

scala ×2

c++ ×1

callback ×1

clojure ×1

coding-style ×1

common-lisp ×1

enums ×1

f# ×1

field ×1

function ×1

go ×1

gtk ×1

immutability ×1

java ×1

lisp ×1

logging ×1

python ×1

r ×1

rust ×1

rust-gnome ×1