我大部分时间都在使用===Ruby中的模式匹配值.最近,我发现该语言还支持=~运算符的正则表达式.
的Ruby文档定义===为"壳体平等"和=~为"图案匹配".
Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写,以在case语句中提供有意义的语义.
模式匹配 - 由后代(特别是Regexp和String)覆盖,以提供有意义的模式匹配语义.
通过实验,我发现它===适用于正则表达式,类名,文字值甚至范围,而=~似乎只返回正则表达式的有用值.我的问题是:我为什么要用=~?它似乎===支持一切=~,然后一些.我在这里缺少=~哪些意图以不同的方式做什么?
我有一些神秘类型的值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) 我有一个看起来像这样的功能.
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)
但是,这会产生错误.
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
从错误中可以看出,上面的语法是两个单独的关键字列表.现在,我可以使用以下稍微不方便的语法来调用此函数
Example.test foo: 1, do: (
"Hello"
)
Run Code Online (Sandbox Code Playgroud)
但有没有办法do在一个函数调用中提供除了其他关键字参数之外的-block?
我遇到了一个关于 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)
需要注意的换行符b和c。
将代码更改为
(format t "~S" (f "a" …Run Code Online (Sandbox Code Playgroud) Elixir 似乎是一种很棒的语言。但是声明全局常量的最佳约定是什么?
我希望模块属性可能是最合适的解决方案?
交换下面的 Horizontal_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) 我需要创建一个函数,从一个容器的开头和结尾接收迭代器.然后它应该在控制台中显示内容.
我的问题是我不知道如何声明迭代器,以便它可以使用任何类型的容器
这就是我做的:
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) 我正在尝试学习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很新,但是这里发生了什么?
我有一个 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
用户通过表单上传图像文件,我不想将原始上传的图像文件保存到磁盘,并通过Pillow从磁盘打开图像来调整图像大小.
我想首先在内存中调整此映像文件的大小,然后将调整大小的映像文件保存到磁盘.所以我导入StringIO作为缓冲区,但它不适用于Pillow.
这是代码:
Python3.4,Flask == 0.10.1,Pillow == 3.4.2
class Form():
img = FileField()
submit = SubmitField()
Run Code Online (Sandbox Code Playgroud)
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,而不是字节
对于那些善于使用Haskell的人来说,这是一个简单的问题!为什么我写:
let a b = (5,6)
Run Code Online (Sandbox Code Playgroud)
我获得了一个功能:
a :: p -> (a, b)
Run Code Online (Sandbox Code Playgroud)
此外,b未实例化.我试图理解它是徒劳的.谢谢你的帮助!
读这个问题让我思考什么构成了一个有效的表达式汽车.显然,可以使用通常的语法"调用"符号和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同意,我猜测正确的实现应该拒绝该代码.作为第二个问题,我如何从代码片段中调用我令人难以置信的无用功能,因为我上面尝试过的东西不能轻松工作.或者,也许更有用,
首先,我对这个不太好的标题表示歉意,我是 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) 我有一个像这样的数组:
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 )