年轻人的第一篇V语言笔记

V语言极限学习

我听说V语言看文档半小时就能完全掌握????以我的智商一小时掌握不了我就给各位科普一下广告法???

宇宙惯例hello world

// first v code
fn main(){printIn("hello world")
}
  • 不需要行结束符
  • v函数使用fn声明,和其他语言一样,main函数是程序入口
  • 注释规则和c一样
  • 输出使用内置函数 printIn()

宇宙惯例2. 1+1

fn main(){a := 1b := 2mut name := "v langue"name = "v"printIn(add(a,b))
}
fn add(a int,b int) int {return a+b
}
  • 变量名在类型名之前(反人类)
  • 函数和变量都可以提前,也就是可以“先调用,再声明”
  • 变量用:=声明并初始化,变量默认不允许修改,要修改必须加 mut
  • 修改变量用 =
  • v没有全局变量,变量只能在函数中定义
  • 定义的变量必须使用,不允许只定义,不使用,和go像
  • 子代码块中不允许使用父代码块中已经定义的变量,如下面的代码会编译出错
fn main(){a := 20if true{a := 30}
}

基本数据类型

string

在V中,字符串是只读字节数组。 字符串数据使用UTF-8编码。

单引号和双引号都可用于表示字符串(TODO:尚不支持双引号)。 为保持一致性,vfmt将双引号转换为单引号,除非该字符串包含单引号字符。

字符串是不可变的。 这意味着子字符串函数非常有效:不执行复制,不需要额外的分配。

All operators in V must have values of the same type on both sides. This code will not compile if age is an int:
println('age = ’ + age)
We have to either convert age to a string:
println('age = ’ + age.str())
or use string interpolation (preferred):
println(‘age = $age’)

翻译
V中的所有运算符必须在两边都具有相同类型的值。如果age是int: println(‘age = ’ + age’),这段代码将无法编译。我们必须将age转换为一个字符串:println('age = ’ + age.str())或使用字符串插值(preferred): println(‘age = ’ $age’)

数组

fn main(){a := [1,2,3]printIn(a)
}
  • 数组类型由数组第一个元素决定
  • 数组中元素类型必须相同
  • 使用<<在数组末尾插入元素
  • 使用.len返回数组长度
  • val in array,如果数组array包含val,返回true

字典

mut m := map[string]int{} // Only maps with string keys are allowed for now  
m['one'] = 1
println(m['one']) // ==> "1" 

这个字典人家似乎还没有写好,emmmm,一堆TODO,你先写着,咱不急,看下一个

流程控制

if

a := 10 
b := 20 
if a < b { println('$a < $b') 
} else if a > b { println('$a > $b') 
} else { println('$a == $b') 
} 
  • 条件没有小括号
  • 始终有大括号
  • if语句可以作为一个表达式
num := 777
s := if num % 2 == 0 {'even'
}
else {'odd'
}
println(s) // ==> "odd"

in

作用:

  1. 检查数组中是否含有某个元素
  2. 布尔表达式,如:
if parser.token == .plus || parser.token == .minus || parser.token == .div || parser.token == .mult {... 
} if parser.token in [.plus, .minus, .div, .mult] {... 
} 

上下两个是等价的,使用下面的语法时,v不会创建数组

for

for比较牛逼,因为我看他文档写的比之前的都多…(狗头),知道为啥吗,应为v只有一种循环,就是for,哈哈哈哈

虽然只有一种循环,但人家for有好几种啊~~~

for in

fn main(){list := ['a','b','c']for value in list{printIn(value)}
}

value-in

如果需要数据的索引,可以用另一种方法

names := ['Sam', 'Peter']
for i, name in names {println('$i) $name')  // Output: 0) Sam
}                         //         1) Peter

第二种for(类似于while)

mut sum := 0
mut i := 0
for i <= 100 {sum += ii++
}
println(sum) // ==> "5050"
  • 不写条件将导致死循环

第三种for(类似c)

for i := 0; i < 10; i++ {println(i)
}
  • 为啥这儿的i不用加mut而可以变化??别问,文档这么写的!!!

Here i doesn’t need to be declared with mut since it’s always going to be mutable by definition.

switch

os := 'windows' 
print('V is running on ')
switch os {
case 'darwin':println('macOS.')
case 'linux':println('Linux.')
default:println(os) 
}

这里的switch和c里的差不多,只不过v中不需要在每个case后面加break

结构体

结构体???你可别告诉我你面向过程啊

struct Point {x inty int 
} p := Point{x: 10 y: 20 
} 
println(p.x) // Struct fields are accessed using a dot 
  • 属性访问用.
  • 结构是在堆栈上分配的。若要在堆上分配结构并获取指向它的指针,请使用&,如
pointer := &Point{10, 10}  // 有三个或更少字段的结构体可使用这种替代写法
println(pointer.x) // 用指针访问值和其他一样,都用.  
  • 结构体嵌套,目前还不支持,不过快了
// 就直接复制了,他支持了再说(到时候我也不一定看)
V doesn't have subclassing, but it supports embedded structs:// TODO: this will be implemented later in June
struct Button {Widgettitle string
}button := new_button('Click me')
button.set_pos(x, y)// Without embedding we'd have to do
button.widget.set_pos(x,y)

访问修饰符

默认的结构体是私有的,不可变的,可以使用访问修饰符pub 和 mut 修改,pub和mut有五种组合(不明白了吧,还有一种pub mut mut),先把文档复制过来再看是个什么妖魔

struct Foo {a int     // private immutable (default) 
mut: b int     // private mutable c int     // (you can list multiple fields with the same access modifier)   
pub: d int     // public immmutable (readonly) 
pub mut: e int     // public, but mutable only in parent module  
pub mut mut: f int 	  // public and mutable both inside and outside parent module  
}                 // (not recommended to use, that's why it's so verbose) 
访问修饰符作用
不写(默认)私有,不可变
mut私有,可变
pub公有,不可变
pub mut公有,仅在父模块可变
pub mut mut公有,父模块内部外部都可变

一脸懵逼是吧,哈哈哈,依老衲看来,这和c++中的public,private啥的一样,只不过他的变量(不能叫变量吧,先这样叫)默认是常量(const)你定义时需要加一个mut才能变成其他语言的“变量”,加一个pub这个变量就变成公有变量,从结构体外部可以访问了,加一个pub mut他就在结构体内外可以访问,而只能在结构体内部能改变,如字符串结构体中的len,外部可以访问他,但不能改变它,内部才能改变,最后pub mut mut 就是内外都可以访问,都可以修改。

Methods,方法

v没有class 吓死我了,辛亏有方法

一个方法就是一个函数,它带一个特殊的参数(接收器)

// 继续粘贴文档代码,CV工程师,年薪百万,啊啊啊啊啊啊啊啊
struct User {age int 
} fn (u User) can_register() bool {return u.age > 16 
} user := User{age: 10} 
println(user.can_register()) // ==> "false"  user2 := User{age: 20} 
println(user2.can_register()) // ==> "true"
  • 这里的can_register就是一个方法,他的接收器是u,类型是User,官方说接收器名字最好用简短的,别用self,this啥的,一个字母最好(要不然没特色,开玩笑的)

Pure functions by default

英语捉急,无法翻译,大概就是默认的纯函数,应为V没有全局变量,加上变量默认不能改变,哪怕是传参时也一样,

后面开始赋值粘贴了

struct User {
mut:is_registered bool 
} fn (u mut User) register() {u.is_registered = true 
} mut user := User{} 
println(user.is_registered) // ==> "false"  
user.register() 
println(user.is_registered) // ==> "true"  
fn multiply_by_2(arr mut []int) {for i := 0; i < arr.len; i++ {arr[i] *= 2}
}mut nums := [1, 2, 3]
multiply_by_2(mut nums)
println(nums) // ==> "[2, 4, 6]"
  • 注意,在调用此函数时,必须在nums之前添加mut。 这清楚地表明被调用的函数将修改该值。
  • 最好返回值而不是修改参数。修改参数应该只在应用程序的性能关键部分执行,以减少分配和复制。
  • 使用user.register()或user = register(user)代替register(mut user)。
  • V可以很容易地返回对象的修改版本:
fn register(u User) User { return { u | is_registered: true } 
}user = register(user) 

常量const

const (PI    = 3.14World = '世界'
) println(PI)
println(World)
  • 常量使用const声明。
  • 它们只能在模块级别(函数之外)定义。
  • 常量名称必须大写。这有助于将它们与变量区分开来。
  • 常数永远不会改变。
  • V常量比大多数语言更灵活。您可以分配更复杂的值
struct Color {r intg intb int
}fn (c Color) str() string { return '{$c.r, $c.g, $c.b}' }fn rgb(r, g, b int) Color { return Color{r: r, g: g, b: b} }const (Numbers = [1, 2, 3]Red  = Color{r: 255, g: 0, b: 0}Blue = rgb(0, 0, 255)
)println(Numbers)
println(Red)
println(Blue)
  • 不允许使用全局变量,因此这非常有用。

模块化

V是一种非常模块化的语言。鼓励创建可重用模块,而且非常简单。要创建一个新模块,请创建一个目录,其中包含模块的名称和.v文件

cd ~/code/modules
mkdir mymodule
vim mymodule/mymodule.v// mymodule.v
module mymodule// To export a function we have to use `pub`
pub fn say_hi() {println('hello from mymodule!')
}

你可以在mymodule /中拥有尽可能多的.v文件。
使用v -lib~ / code / modules / mymodule构建它。
就是这样,您现在可以在代码中使用它

module mainimport mymodulefn main() {mymodule.say_hi()
}
  • 注意,每次调用外部函数时都必须指定模块。
  • 模块名称应该简短,不超过10个字符。
  • 不允许循环导入。
  • 您可以在任何地方创建模块。
  • 所有模块都被静态地编译成一个可执行文件。

看了两个小时了,还没看完,以我的智商,算是告别代码界了,再见各位,我自闭了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android studio运行手机时出错怎么解决_小程序 android ios h5解决方案

你现在开发android,ios,小程序用什么工具&#xff0c;怎么开发的&#xff1f;还在单个端的开发吗&#xff1f;今天我们主要讨论的是一次开发多端使用的技术&#xff0c;也是这两年比较流行的开发方向。现在的终端太多了&#xff0c;app两个端android和ios,小程序有微信&#xf…

Android SDK上手指南:应用程序数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/52996965 在本系列教程当中&#xff0c;我们将学习如何从零开始进行Android SDK开发。我们已经熟悉了Android应用程序的结构与基本组成元素&#xff0c;…

设计微服务架构需要解决的问题

问题&#xff1a; 划分服务的原则是什么服务之间选择何种轻量级的通信协议如何做到服务的独立部署如何确定使用何种编程语言?控制多语言带来的复杂度如何做到服务的去中心化如何解决大量微服务引入的运维成本转载于:https://www.cnblogs.com/fight-tao/p/5641286.html

Django Model设计详解

Django Model 设计 Django Model设计是Django五项基础核心设计之一&#xff08;Model设计&#xff0c;URL配置&#xff0c;View编写&#xff0c;Template设计&#xff0c;From使用&#xff09;&#xff0c;也是MVC模式中重要的环节。 如果图片无法访问&#xff0c;大家可以移…

python设置全局变量失败_Python全局变量与global关键字常见错误解决方案

在Python的变量使用中&#xff0c;经常会遇到这样的错误:local variable a referenced before assignment它的意思是&#xff1a;局部变量“a”在赋值前就被引用了。比如运行下面的代码就会出现这样的问题&#xff1a;a 3def Fuc():print (a)a a 1Fuc()​ 但是如果把 a a …

Atititi tesseract使用总结

Atititi tesseract使用总结 消除bug&#xff0c;优化&#xff0c;重新发布。当前版本为3.02 项目下载地址为&#xff1a;http://code.google.com/p/tesseract-ocr。 Windows cmd命令行使用Tesseract-OCR引擎识别验证码: 1、下载安装Tesseract-OCR引擎(3.0版本才支持中文识别) t…

Javascipt数组去重的几种方式

方法一 function unique(arr) {var retArr [];for (var i 0; i < arr.length; i) {(retArr.indexOf(arr[i]) -1) && retArr.push(arr[i]);}return retArr; } 方法二 function unique(arr) {return arr.filter(function(item, index, array) {return array.indexO…

01_JS语法

JS语法 严格区分大小写以;结尾&#xff0c;不写浏览器会自动加&#xff0c;但不准确&#xff0c;且会占用浏览器资源自动忽略多个空格和换行 写在哪 所有JS代码都必须依托网页运行 内嵌 写在html的script标签中 <script>// JS代码 </script>事件 写在某个ht…

pythonwhile循环love_python基础之while循环及编码

while 条件&#xff1a;循环体死循环&#xff1a;没有终止条件(修改方法&#xff1a;1.改变条件2.使用break)break 终止当前循环contiune&#xff1a;跳出本次循环&#xff0c;继续下次循环break和contione必须在循环体里while 条件&#xff1a;循环体else&#xff1a;结果当wh…

css页面布局

居中布局 水平居中 父元素和子元素的宽度都未知 inline-block text-ailgn .child{display:inline-block;} .parent{text-align:center;} 优点&#xff1a;兼容性好 缺点&#xff1a;子元素文本继承了text-align属性&#xff0c;子元素要额外加text-align:left; table ma…

02_JS变量

JS变量 字面量 常量&#xff0c;不可变量 变量 变量用 var 变量名声明 命名 变量命名以数字字母下划线和$组成&#xff0c;不能以数字开头&#xff0c;还可以是utf-8的任意字符&#xff0c;包括中文&#xff0c;一般采用驼峰命名法 常用的几个函数 alert():浏览器弹窗d…

Rotate String

Given a string and an offset, rotate string by offset. (rotate from left to right) Example Given "abcdefg". offset0 > "abcdefg" offset1 > "gabcdef" offset2 > "fgabcde" offset3 > "efgabcd"分析&am…

音视频播放、录音、拍照

音频 在iOS中音频播放从形式上可以分为音效播放和音乐播放。前者主要指的是一些短音频播放&#xff0c;通常作为点缀音频&#xff0c;对于这类音频不需要进行进度、循环等控制。后者指的是一些较长的音频&#xff0c;通常是主音频&#xff0c;对于这些音频的播放通常需要进行精…

python 递归函数与循环的区别_提升Python效率之使用循环机制代替递归函数

斐波那契数列当年&#xff0c;典型的递归题目&#xff0c;斐波那契数列还记得吗&#xff1f;def fib(n):if n1 or n2:return 1else:return fib(n-1)fib(n-2)当然, 为了程序健壮性&#xff0c;加上try...except...def fib(n):if isinstance(n, int):print(兄弟,输入正整数哈)ret…

03_JS数据类型

JS数据类型 基本数据类型 String 字符串类型&#xff0c;申明时用单引号或双引号引起来&#xff0c;两种引号不可嵌套&#xff0c;不可混用 Number 数值型&#xff0c;有两个特殊的数字 Infint:无穷大NaN&#xff1a;非数值型数字&#xff0c;不与任何类型相等 Boolean …

7.5

姓名 崔巍 时间 2016年7月5日 学习内容 最后一次确定同步控制力度等实现细节。 学习了Visual Studio C#软件测试方面的工具。巩固了等价类黑盒测试方法的相关理论&#xff0c;并且学习了集成测试、回归测试的相关内容&#xff0c;并进行了测试。 集成测试&#xff0c;…

python scratch ev3_如何在scratch上连接乐高ev3?

乐高教育的官网有关于EV3使用Python的详细介绍https://education.lego.com/zh-cn/support/mindstorms-ev3/python-for-ev3​education.lego.com来自网易有道Scratch是现在小朋友们最热的编程工具&#xff0c;也是各学校和培训机构对小学生编程的入门首选。网易有道Kada平台是一…

04_JS运算符

JS运算符 一元运算符 -,正负号&#xff0c;对非数值类型做正负操作会先转换成数值型&#xff0c;可以用快速进行类型转换 逻辑运算符 且 &&&#xff0c;从左到右看&#xff0c;一旦返现值为false的表达式立刻返回false&#xff0c;全真为真或 ||&#xff0c;从左到右…

C语言 第八章 函数、指针与宏

一、函数 函数是一个包含完成一定功能的执行代码段。我们可以把函数看成一个"黑盒子", 你只要将数据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不知道的。外部程序所知道的仅限于输入给函数什么以及函数输出什么。函数提供了编制程序的手段,使之…

ByteBuffer用法小结

在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道…