在一篇名为"未来之路"的演讲中,道格拉斯·克罗克福德表示,他不再在他的JavaScript中使用"新",而是将自己从"这个"中解脱出来.他说JavaScript的优点不是原型继承,而是无类继承.他提供了以下片段,这是他如何定义他的对象:
function constructor(init) {
var that = other_constructor(init),
member,
method = function () {
// init, member, method
};
that.method = method;
return that;
}
Run Code Online (Sandbox Code Playgroud)
他解释说:
我有一个函数,它将需要一些值来初始化它.我建议将它作为一个对象,(这样你就可以使用JSON文本来创建新实例).如果你想继承它的东西,你可以调用另一个构造函数; 无论如何,你要创建一个对象并将其放在一个名为"that"的变量中.您将创建所有成员变量(将成为对象的属性,方法变量的属性,将作用于对象的事物......)这些方法将是将关闭初始化值的函数覆盖所有成员变量和所有方法变量.
它也可以使用"this"和"that",但我建议不要.的理由,否则即是,如果不使用"这个"或"是",那么你可以采取任何的功能出来的对象和independantly打电话给他们,他们还是做同样的事情.这样可以提高语言的可靠性.也意味着你可以传递任何这些东西,使用它作为回调而不必绑定任何东西(它变得更可靠).然后,任何需要公开或特权的方法只需将它们附加到对象并返回对象.这是一个非常灵活的模式 - 你可以获得多重继承,你可以获得方面,你可以获得工厂 - 你可以用这个基本模式做很多事情.
为什么此代码段会进行以下分配?
that.method = method
Run Code Online (Sandbox Code Playgroud)
方法有什么用途?它是如何初始化的?以这种方式声明对象的目的是什么?
他的演讲非常笼统,他只花了一分钟时间来讨论这部分内容而没有详细说明他的推理或引用资源.任何人都可以阐明这种编程风格的动机吗?
视频链接:https: //www.youtube.com/watch?v = 3WgVHE5Augc约37分钟开始
我正在尝试开发一个函数,它对两个具有相同键的值执行数学运算:
property = {a=120, b=50, c=85}
operator = {has = {a, b}, coefficient = {a = 0.45}}
function Result(x) return operator.has.x * operator.coefficient.x end
print (Result(a))
error: attempt to perform arithmetic on field 'x' (a nil value)
Run Code Online (Sandbox Code Playgroud)
问题是该函数在字面上"operator.has.x"而不是"operator.has.a"上尝试数学.
我能够调用函数(x)返回x.something结束,但如果我尝试函数(x)something.xi得到一个错误.我需要提高我对Lua中函数的理解,但我在手册中找不到这个.
我买了一份 Tiny C 编译器 (TCC),这样我就可以在工作中进行一些 C 编程。不幸的是,新的网络安全策略禁止非 IT 人员下载/保存 exe 文件。当然,每次我尝试编译 helloworld.c 时,老板都会收到通知,说我是一个恶意的恶搞者......
我的问题——是否有某种 C 解释器或环境可以让我练习 C 编程?或者某种方法以不同的方式编译我的程序来测试它们,而不会无意中规避安全措施?
我正在尝试一个应该测试fmt.Scanf的片段,但它似乎没有按预期工作:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("What is your favorite color?")
var favoriteColor string
fmt.Scanf("%s", &favoriteColor)
fmt.Println("Fave color is", favoriteColor)
fmt.Println("What is your favorite food?")
var myfood string
fmt.Scanf("%s", &myfood)
fmt.Printf("I like %s too!\n", myfood)
fmt.Printf("Wait two seconds please...\n")
time.Sleep(2000 * time.Millisecond)
fmt.Printf("Your favorite color is %s, and the food you like best is %q\n", favoriteColor, myfood)
}
Run Code Online (Sandbox Code Playgroud)
然而,只有第一个答案,程序继续到最后,然后返回:
What is your favorite color?
red
Fave color is red
What is your favorite food?
I …Run Code Online (Sandbox Code Playgroud) 我有一个函数stuff(),它返回一个要打印的字符串main.
#include <stdio.h>
char* stuff(char* thing) {
return ("this and %s", thing);
}
int main() {
char* thing = "that";
printf("%s\n", stuff(thing));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待着
这个和那个
在程序运行时打印,但我看到:
那
是否有人能够指导我完成程序实际执行的操作,更重要的是,我做错了什么?
Go文档表明应该使用速记:
x := "Hello World"
Run Code Online (Sandbox Code Playgroud)
而不是长形式
var x string = "Hello World"
Run Code Online (Sandbox Code Playgroud)
提高可读性.虽然以下工作:
package main
import "fmt"
var x string = "Hello World"
func main() {
fmt.Println(x)
}
Run Code Online (Sandbox Code Playgroud)
这不是:
package main
import "fmt"
x := "Hello World"
func main() {
fmt.Println(x)
}
Run Code Online (Sandbox Code Playgroud)
并给出错误"函数体外的非声明语句".相反,我在函数中声明它:
package main
import "fmt"
func main() {
x := "Hello World"
fmt.Println(x)
}
Run Code Online (Sandbox Code Playgroud)
然后它工作得很好.看来我只能在使用变量的函数中使用简写.是这样的吗?谁能告诉我为什么?
简化问题:
程序员是否可以跟踪变量的地址,以便变量的地址可以用作该变量的数据点?
原始问题:
我试图围绕如何使用Go中的指针存储和引用地址引用变量.
作为一般原则,直接分配变量的地址是否有用?我可以想象一种情况,即数据可以在变量的物理(虚拟)地址中编码,而不一定是该变量的值.
例如,第1000位客户已经购买了500美元.我可以在1000位置存储一个值为500的整数吗?
我知道做这样的事情的常用方法是使用数组,其中位置999的变量对应于第1000个客户,但我的问题不是数组,而是直接分配地址.
假设我正在处理数十亿个对象.有没有一种简单的方法可以将地址用作对象数据的一部分,并将该位置存储的值作为不同的数据?
例如,地址135851851904处的int保持值为46876,135851851905保持123498761等.我想在这一点上,数组或切片太大而不能有效.
顺便说一句,如果我的问题是由于误解,是否有人可以提供哪些资源以深入但可理解的细节解释主题?我一直无法找到真正解释细节的主题资源.
假设我有两只宠物,一只名叫露西的猫和一只名叫Fido的狗.我教过他们同样的伎俩,"说".
在将来我想获得更多的宠物,并教他们不同的技巧,所以在预期中,我编码到一个界面:
package main
import "fmt"
type Pet interface {
speak() string
}
type Dog struct {
speech string
}
type Cat struct {
speech string
}
func (c Cat) speak() string {
return c.speech
}
func (d Dog) speak() string {
return d.speech
}
func getSpeech(p Pet) string {
return p.speak()
}
func main() {
Fido := Dog{"woof"}
Lucy := Cat{"meow"}
fmt.Println("Fido says:", getSpeech(Fido)) // Fido says: woof
fmt.Println("Lucy says:", getSpeech(Lucy)) // Lucy says: meow
}
Run Code Online (Sandbox Code Playgroud)
现在,虽然这很好用,但似乎不必要地冗长.我显然在重复自己.另外,假设所有Dogs都说"woof"并且所有Cats都说"喵",那么初始化结构中的字符串是不是惯用?
在不失去界面优势的情况下,您如何将此代码重新考虑为更干燥?
我包含头文件时出错,但如果我包含源文件则不会出错.
该函数在源文件中定义如下:
/* in User.c */
struct User {
const char* name;
};
struct User* addedUser(const char* name) {
struct User* user = malloc(sizeof(struct User));
user->name = name;
return user;
}
Run Code Online (Sandbox Code Playgroud)
像这样使用:
/* in main.c */
int test_addedUser() {
char* newName = "Fooface";
struct User* newUser = addedUser(newName);
assert(!strcmp(newName, newUser->name));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.当我#include"User.c"时,我能够毫无问题地调用test_addUser.
但是,我想改为#include"User.h",它位于同一目录中:
/* in User.h */
struct User {
const char* name;
};
struct User* addedUser(const char*);
Run Code Online (Sandbox Code Playgroud)
但是,如果我#include"User.h"而不是User.c,我收到一个错误:
CMakeFiles/run_tests.dir/src/tests.c.o: In function `test_addedUser':
/home/rid/port/src/tests.c:(.text+0x4eb): undefined reference to `addedUser' …Run Code Online (Sandbox Code Playgroud) 我在这里已经阅读了很多关于C指针的问题和答案,但是没有找到解释为什么C不允许地址存储在常规int中的任何东西 - 它似乎更简单地输入:
int a = 100;
int b = &a;
int c = &b; //etc
Run Code Online (Sandbox Code Playgroud)
而不是
int a = 100;
int* b = &a;
int** c = &b; //etc
Run Code Online (Sandbox Code Playgroud)
实际上,我不确定是否所有编译器都不允许这样做,或者它是否仅标记警告.但是,如果我完成同样的事情,(存储变量的地址以供参考),如果我使用指针表示法或直接分配值,它会有什么不同?
我正在研究Rust文档(书),并对使用分号分隔语句感到困惑.
在一个示例中,它使用println!宏作为以分号结束的语句:
use std::cmp::Ordering;
fn cmp(a: i32, b: i32) -> Ordering {
if a < b { Ordering::Less }
else if a > b { Ordering::Greater }
else { Ordering::Equal }
}
fn main() {
let x = 5;
let y = 10;
let ordering = cmp(x, y);
if ordering == Ordering::Less {
println!("less");
} else if ordering == Ordering::Greater {
println!("greater");
} else if ordering == Ordering::Equal {
println!("equal");
}
}
Run Code Online (Sandbox Code Playgroud)
当使用match表达式来简化它时...
use std::cmp::Ordering;
fn …Run Code Online (Sandbox Code Playgroud)