小编Sil*_*olo的帖子

Ruby = ~vs ===运算符

我大部分时间都在使用===Ruby中的模式匹配值.最近,我发现该语言还支持=~运算符的正则表达式.

Ruby文档定义===为"壳体平等"和=~为"图案匹配".

Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写,以在case语句中提供有意义的语义.

模式匹配 - 由后代(特别是Regexp和String)覆盖,以提供有意义的模式匹配语义.

通过实验,我发现它===适用于正则表达式,类名,文字值甚至范围,而=~似乎只返回正则表达式的有用值.我的问题是:我为什么要用=~?它似乎===支持一切=~,然后一些.我在这里缺少=~哪些意图以不同的方式做什么?

ruby regex operator-overloading

3
推荐指数
1
解决办法
773
查看次数

如果已知则使用编译时常量

我有一些神秘类型的值T(对于这个例子,我们可以假设T是一个整数类型).我想在一些模板函数中使用此值作为模板参数(对于此示例,参数为std::integral_constant).麻烦的是,这T可能不是一个常数类型.如果它不是常量类型,我想0在我的模板函数中默认.但是,如果它是常数,我想使用值本身,因为它是已知的.

目前,我有以下(非编译)代码.

#include <type_traits>

template <typename T>
struct CompileTimeStuff {
    constexpr static int value(T arg) { return 0; }
};

template <typename T>
struct CompileTimeStuff<const T> {
    constexpr static int value(const T arg) { return (int)arg; }
};

template <typename T>
constexpr int magic_function(T arg) {
    return CompileTimeStuff<T>::value(arg);
}

const int cvalue = 7;
int ivalue = 7;

// This should be 7, since cvalue is constant and thus known …
Run Code Online (Sandbox Code Playgroud)

c++ templates compile-time

3
推荐指数
1
解决办法
69
查看次数

使用do-block的关键字参数

我有一个看起来像这样的功能.

def test(options \\ []) do
  # Fun stuff happens here :)
end
Run Code Online (Sandbox Code Playgroud)

它接受几个(可选的)关键字参数,包括do:.我希望能够这样称呼它.

test foo: 1 do
  "Hello"
end
Run Code Online (Sandbox Code Playgroud)

但是,这会产生错误.

** (UndefinedFunctionError) function Example.test/2 is undefined or private. Did you mean one of:

      * test/0
      * test/1

    Example.test([foo: 1], [do: "Hello"])
    (elixir) lib/code.ex:376: Code.require_file/2
Run Code Online (Sandbox Code Playgroud)

从错误中可以看出,上面的语法是两个单独的关键字列表.现在,我可以使用以下稍微不方便的语法来调用此函数

Example.test foo: 1, do: (
  "Hello"
)
Run Code Online (Sandbox Code Playgroud)

但有没有办法do在一个函数调用中提供除了其他关键字参数之外的-block?

syntactic-sugar elixir keyword-argument

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

神秘的换行符出现在 Common Lisp 格式指令中

我遇到了一个关于 Common Lispformat指令的奇怪问题,它只在 GNU CLISP 中显示,这让我怀疑它是否是实现中的错误。

考虑以下代码

(defun f (s args)
  (format nil "~A~{~A~%~}" s args))
Run Code Online (Sandbox Code Playgroud)

该函数f生成一个由s参数组成的字符串,后跟每个参数,其中每个参数(但不是标题)后跟一个换行符。所以,例如,我希望

(format t "~A" (f "foo" '("arg1" "arg2")))
Run Code Online (Sandbox Code Playgroud)

生产

fooarg1
arg2
Run Code Online (Sandbox Code Playgroud)

它确实做到了。现在,考虑以下调用

(format t "~A" (f "a" ()))
(format t "~A" (f "b" ()))
(format t "~A" (f "c" '("d")))
Run Code Online (Sandbox Code Playgroud)

鉴于我打印出的唯一换行符是来自 的第二个参数的元素f,并且前两次调用为第二个f参数传递一个空列表,我希望直到最后都看不到换行符,即我希望它打印

abcd
Run Code Online (Sandbox Code Playgroud)

它在 SBCL 中正是这样做的。但是,在 GNU CLISP 中,我得到

ab
cd
Run Code Online (Sandbox Code Playgroud)

需要注意的换行符bc

将代码更改为

(format t "~S" (f "a" …
Run Code Online (Sandbox Code Playgroud)

format clisp common-lisp string-formatting

3
推荐指数
1
解决办法
49
查看次数

Elixir 中如何声明全局常量?

Elixir 似乎是一种很棒的语言。但是声明全局常量的最佳约定是什么?

我希望模块属性可能是最合适的解决方案?

交换下面的 Horizo​​ntal_line 定义可以修复编译错误。

defmodule ElixirTesting do

  horizontal_line = String.duplicate("-", 80)
#  def horizontal_line, do: String.duplicate("-", 80)

  def test_global_constant do
    IO.puts(horizontal_line)
    IO.puts("Console Report Section Title")
    IO.puts(horizontal_line)
    true
  end

end
Run Code Online (Sandbox Code Playgroud)

elixir

3
推荐指数
1
解决办法
1009
查看次数

声明一个模板函数,它接收两个通用迭代器作为参数

我需要创建一个函数,从一个容器的开头和结尾接收迭代器.然后它应该在控制台中显示内容.

我的问题是我不知道如何声明迭代器,以便它可以使用任何类型的容器

这就是我做的:

template <class T>
void print(typename iterator<T> &beg, typename iterator<T> &end) {
    while (beg != end) {
        cout << *beg << endl;
        beg++;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ templates

2
推荐指数
1
解决办法
47
查看次数

关于执行订单的问题

我正在尝试学习Common Lisp,并在repl中尝试一些东西时发现了意想不到的东西(对我而言).基于大多数编程语言中的执行顺序,以及我从lisp一直听到的一流的功能支持,我认为以下应该有效:

((if t 'format) t "test")
Run Code Online (Sandbox Code Playgroud)

在Ruby中我可以做到:

if true
  Object.method(:puts)
end.call("test")
Run Code Online (Sandbox Code Playgroud)

我对上述lisp代码应该如何工作的思考是它应该评估内部lisp表单,返回格式,然后开始评估外部lisp表单,format然后是第一个原子.我读过第一个表单需要是一个符号,所以我也试过((if t format) t "test"),尽管我最初的想法是,这会尝试在从内部表单返回之前评估格式.

我注意到有时候需要先输入lisp表单#'才能使结果可以调用,但是使用(#'(if t 'format) t "test")也不起作用.我确信我只是误解了一些基本的东西,因为我对lisp很新,但是这里发生了什么?

lisp sbcl common-lisp

2
推荐指数
1
解决办法
67
查看次数

C++ std::array 迭代器是否保证是类似指针的?

我有一个 C++ 数组:

std::array<int, 10> arr { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Run Code Online (Sandbox Code Playgroud)

我想反转最后五个元素,最终得到{ 0, 1, 2, 3, 4, 9, 8, 7, 6, 5 }. 我知道std::array给了我随机访问迭代器,所以我绝对可以这样写:

std::reverse(arr.begin() + 5, arr.end());
Run Code Online (Sandbox Code Playgroud)

但是,我想知道其他一些可能的方法。

T*是一个随机访问迭代器,所以我可以这样写:

std::reverse(&arr[5], &arr[arr.size()]);
Run Code Online (Sandbox Code Playgroud)

相当确定这是明确定义的,因为允许引用(但不能访问)数组的末尾一位。

我想知道是否允许这样做:

std::reverse(&arr[5], arr.end());
Run Code Online (Sandbox Code Playgroud)

这在我的机器上运行,但这并不意味着它是标准行为。

如果arr是一个C风格的数组T[],那么它的迭代器类型显然是T*。但是,至少粗略地看一下,我没有看到任何与它std::array<T, C>::iterator相同的保证T*,甚至可以与之相媲美。

标准是否保证上述代码行有效?s是否保证与指向数组中元素的std::array<T, C>::iterator指针兼容?T

c++ arrays pointers iterator

2
推荐指数
1
解决办法
154
查看次数

Pillow如何直接从StringIO打开上传的图像文件?

用户通过表单上传图像文件,我不想将原始上传的图像文件保存到磁盘,并通过Pillow从磁盘打开图像来调整图像大小.

我想首先在内存中调整此映像文件的大小,然后将调整大小的映像文件保存到磁盘.所以我导入StringIO作为缓冲区,但它不适用于Pillow.

这是代码:

Python3.4,Flask == 0.10.1,Pillow == 3.4.2

forms.py

class Form():
    img = FileField()
    submit = SubmitField()
Run Code Online (Sandbox Code Playgroud)

views.py

from io import StringIO
from PIL import Image
from .forms import Form

@app.route('/upload_img', methods=['GET', 'POST'])
def upload_img():
    form = Form()
    im = Image.open(StringIO(form.img.data.read())

    pass
Run Code Online (Sandbox Code Playgroud)

TypeError:initial_value必须是str或None,而不是字节

python stringio flask pillow

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

来自元组的函数 - Haskell

对于那些善于使用Haskell的人来说,这是一个简单的问题!为什么我写:

let a b = (5,6)
Run Code Online (Sandbox Code Playgroud)

我获得了一个功能:

a :: p -> (a, b)
Run Code Online (Sandbox Code Playgroud)

此外,b未实例化.我试图理解它是徒劳的.谢谢你的帮助!

haskell pattern-matching

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

Setf函数名称

这个问题让我思考什么构成了一个有效的表达式汽车.显然,可以使用通常的语法"调用"符号和lambdas.按照hyperspec,

函数名 ñ.1.(在环境中)符号或列表(setf符号),它是该环境中函数的名称.2.符号或列表(setf符号).

因此,理论上讲,它(setf some-name)是一个函数名称.我决定尝试一下.

(defun (setf try-this) ()
  (format t "Don't name your functions like this, kids :)"))

((setf try-this))
(funcall '(setf try-this))
(setf (try-this))
Run Code Online (Sandbox Code Playgroud)

GNU CLISP,SBCL和ABCL都将让我定义这个功能.但是,SBCL和ABCL不允许我使用代码段中显示的任何语法来调用它.另一方面,CLISP将运行前两个但仍然在第三个错误.

我很好奇哪个编译器的行为正确.由于SBCL和ABCL同意,我猜测正确的实现应该拒绝该代码.作为第二个问题,我如何从代码片段中调用我令人难以置信的无用功能,因为我上面尝试过的东西不能轻松工作.或者,也许更有用,

lisp common-lisp setf

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

如何传递实现同一接口的多个类型?

首先,我对这个不太好的标题表示歉意,我是 Java 新手,不知道如何命名它。

我有一个接口类“TestInterface”:

ublic interface TestInterface {

    String getForename();

    void setForename(String forename);

    String getSurname();

    void setSurname(String surname);
}

Run Code Online (Sandbox Code Playgroud)

“TestImpl”实现“TestInterface”:

public class TestImpl implements TestInterface{

    private String forename;

    private String surname;

    @Override
    public String getForename() {
        return forename;
    }

    public void setForename(String forename) {
        this.forename = forename;
    }

    @Override
    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个名为“ExtendTest”的调用,它扩展了“TestImpl”:

public class ExtendTest extends TestImpl{

    private String firstLineAddress;

    public String getFirstLineAddress() {
        return …
Run Code Online (Sandbox Code Playgroud)

java generics pecs

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

使用perl输出数组中的元素

我有一个像这样的数组:

my @array = qw( zero one two three four five six seven eigth nine);
Run Code Online (Sandbox Code Playgroud)

如何从 @array 输出由长度为 4 的字符串组成的子数组。例如,如果字符串等于 4,则新数组将输出为@subarray = ( zero four five nine )

perl

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