F# 选择数组索引的三元运算符
表达式中出现意外的']' 我已经成功地完成了代码的第一部分,现在我想使用存储在成员中的索引查找球员的真实得分。我使用playersTurn并检查它是否是奇数或偶数来代表玩家的回合 我现在遇到的问题是使用三元运算符获得以下代码行中的分数:F# 选择数组索引的三元运算符,f#,F#,表达式中出现意外的']' 我已经成功地完成了代码的第一部分,现在我想使用存储在成员中的索引查找球员的真实得分。我使用playersTurn并检查它是否是奇数或偶数来代表玩家的回合 我现在遇到的问题是使用三元运算符获得以下代码行中的分数: let score = this.scoring[this.playersTurn % 2 = 0 ? this.playerOneScore : this.playerTwoScore] 任何帮助都会非常出色,以下是完整的代码: open System t
let score = this.scoring[this.playersTurn % 2 = 0 ? this.playerOneScore : this.playerTwoScore]
任何帮助都会非常出色,以下是完整的代码:
open System
type Game(playerOne, playerTwo) =
member this.playersTurn = 0
member this.playerOneName = playerOne
member this.playerOneScore = 0
member this.playerTwoName = playerTwo
member this.playerTwoScore = 0
member this.scoring = [|0; 15; 30; 40|]
member this.takeTurn() =
let name = this.playersTurn % 2 = 0 ? this.playerOneName : this.playerTwoName
let score = this.scoring[this.playersTurn % 2 = 0 ? this.playerOneScore : this.playerTwoScore]
printfn name |> "%d is now taking their turn."
if((new System.Random()).Next(0, 15) > 8) then
if (this.playersTurn % 2 = 0) then incr this.playerOneScore
else incr this.playerTwoScore
printfn name |> "%d scored a point!"
else
printfn name |> "%d did not score a point!"
incr this.playersTurn
let tennis = new Game("Player1", "Player2")
tennis.takeTurn()
tennis.takeTurn()
对于F中的三元运算符,您使用的是C语法。您确实需要:
this.scoring.[if this.playersTurn % 2 = 0 then this.playerOneScore else this.playerTwoScore]
对于F中的三元运算符,您使用的是C语法。您确实需要:
this.scoring.[if this.playersTurn % 2 = 0 then this.playerOneScore else this.playerTwoScore]
要使代码正常工作,您需要再做一些更改。最重要的是,您正在使用带有成员的类,但这些是F中的只读getter属性。您可以使它们可变,但这不是惯用的;更好的选择是更改函数,使其返回新的游戏状态 如果您正在学习F,那么我认为最好进行更多的更改,避免使用在F中不经常使用的类,并寻求不需要变异的解决方案。以下内容与您所拥有的内容非常接近 我将常见定义提取到普通let值中-您可以稍后定义一个记录简单数据类型来保存它们,但现在,这是最简单的选项:
open System
let scoring = [|0; 15; 30; 40|]
let playerOne = "Player1"
let playerTwo = "Player2"
let rnd = new System.Random()
我将您的方法转换为一个函数,该函数将圈数和初始分数作为元组,并返回新状态。语法playersTurn、playersecore、playerswoscore定义了一个包含圈数的元组和一个包含两个分数的嵌套元组。我选择这两个分数是因为这两个分数在逻辑上是相关的,所以最好将它们存储在一起:
let takeTurn (playersTurn, (playerOneScore, playerTwoScore)) =
let name = if playersTurn % 2 = 0 then playerOne else playerTwo
let score = scoring.[if playersTurn % 2 = 0 then playerOneScore else playerTwoScore]
printfn "%s is now taking their turn." name
let newOneScore, newTwoScore =
if (rnd.Next(0, 15) > 8) then
printfn "%s scored a point!" name
if (playersTurn % 2 = 0) then playerOneScore + 1, playerTwoScore
else playerOneScore, playerTwoScore + 1
else
printfn "%s did not score a point!" name
playerOneScore, playerTwoScore
playersTurn+1, (newOneScore, newTwoScore)
现在,您可以定义初始状态并重复调用takeTurn以获取下一个状态和下一个状态,依此类推:
let start = 0, (0, 0)
let step1 = takeTurn start
let step2 = takeTurn step1
很明显,您希望在循环中运行它—您可以通过使用递归或使用Seq.unfold之类的函数以函数的方式执行此操作。要使代码正常工作,您需要再做一些更改。最重要的是,您正在使用带有成员的类,但这些是F中的只读getter属性。您可以使它们可变,但这不是惯用的;更好的选择是更改函数,使其返回新的游戏状态 如果您正在学习F,那么我认为最好进行更多的更改,避免使用在F中不经常使用的类,并寻求不需要变异的解决方案。以下内容与您所拥有的内容非常接近 我将常见定义提取到普通let值中-您可以稍后定义一个记录简单数据类型来保存它们,但现在,这是最简单的选项:
open System
let scoring = [|0; 15; 30; 40|]
let playerOne = "Player1"
let playerTwo = "Player2"
let rnd = new System.Random()
我将您的方法转换为一个函数,该函数将圈数和初始分数作为元组,并返回新状态。语法playersTurn、playersecore、playerswoscore定义了一个包含圈数的元组和一个包含两个分数的嵌套元组。我选择这两个分数是因为这两个分数在逻辑上是相关的,所以最好将它们存储在一起:
let takeTurn (playersTurn, (playerOneScore, playerTwoScore)) =
let name = if playersTurn % 2 = 0 then playerOne else playerTwo
let score = scoring.[if playersTurn % 2 = 0 then playerOneScore else playerTwoScore]
printfn "%s is now taking their turn." name
let newOneScore, newTwoScore =
if (rnd.Next(0, 15) > 8) then
printfn "%s scored a point!" name
if (playersTurn % 2 = 0) then playerOneScore + 1, playerTwoScore
else playerOneScore, playerTwoScore + 1
else
printfn "%s did not score a point!" name
playerOneScore, playerTwoScore
playersTurn+1, (newOneScore, newTwoScore)
现在,您可以定义初始状态并重复调用takeTurn以获取下一个状态和下一个状态,依此类推:
let start = 0, (0, 0)
let step1 = takeTurn start
let step2 = takeTurn step1
很明显,您希望在循环中运行它—您可以使用递归或使用Seq.unfold之类的函数以函数的方式运行它。Quick look。一个是数组[| |],一个是列表[],所以结合贾斯汀·尼斯纳的回答和这个评论,应该是这样的。评分[|索引|]@GuyCoderYeah,我想会的。我不是一个F的家伙,只是想学习哈哈。我很感激。我用Justins answer in all use case@Guycoder更新了三元代码基于这一点和你之前的问题,我建议你多学习一点F语言,在尝试更严肃的事情之前,先阅读一些hello world类型的教程。你应该保留这段代码,这对于一个教学练习来说是很好的,因为问题一开始看起来很简单,但一旦解决就变得复杂了。快看。一个是数组[| |],一个是列表[],所以结合贾斯汀·尼斯纳的回答和这个评论,应该是这样的。评分[|索引|]@GuyCoderYeah,我想会的。我不是一个F的家伙,只是想学习哈哈。我很感激。我用Justins answer in all use case@Guycoder更新了三元代码基于这一点和你之前的问题,我建议你多学习一点F语言,在尝试更严肃的事情之前,先阅读一些hello world类型的教程。你应该保留这段代码,这对于一个教学练习来说是很好的,因为问题一开始看起来很简单,但一旦解决就变得复杂了。得分后会漏掉一个点。索引器访问在F中是不同的。同样,修复三元运算符的首次使用。评分后缺少一个点。索引器访问在F中是不同的。另外,修复三元运算符的首次使用。感谢您发布代码,重申我关于回到基本原理的评论。天哪,这里有很多
我需要调查一下!谢谢你!你是否正确增加了分数。它看起来像+1,而不是爱的网球,15,30,40。@KDOT我添加了一些评论,希望能解释我的改变。你的逻辑核心是正确的-我基本上只是删除了类和变异!代码执行数组查找以获得分数,但这从未打印或在任何地方使用-因此计数是可以的,但我想你会想在某个地方打印分数:感谢发布代码,重申我关于回到基本面的评论。天哪,这里有很多我需要研究的内容!谢谢你!你是否正确增加了分数。它看起来像+1,而不是爱的网球,15,30,40。@KDOT我添加了一些评论,希望能解释我的改变。你的逻辑核心是正确的-我基本上只是删除了类和变异!代码执行数组查找以获得分数,但这从未打印或在任何地方使用-因此计数是可以的,但我认为您希望在某个地方打印分数: