==
сравнивает ссылки на объекты.
.equals()
сравнивает значения String.
Иногда ==
дает иллюзии сравнения значений String, как в следующих случаях:
String a="Test";
String b="Test";
if(a==b) ===> true
Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:
(a == b) ===> true
String Pool
b -----------------> "test" <-----------------a
Однако ==
не выполняется в следующем случае:
String a="test";
String b=new String("test");
if (a==b) ===> false
В этом случае для new String("test")
оператор new String будет создан в куче, и эта ссылка будет указана на b
, поэтому b
будет дана ссылка на кучу, а не на String pool.
Теперь a
указывает на String в пуле String, а b
указывает на String в куче. Из-за этого мы получаем:
, если (a == b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Пока .equals()
всегда сравнивает значение String, поэтому дает true в обоих случаях:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Таким образом, использование .equals()
всегда лучше.
Для начала вам нужно сначала создать и передать хранилище userState в ваш файл index.js.
const { ConversationState, MemoryStorage, UserState } = require('botbuilder');
[...]
const conversationState = new ConversationState(memoryStorage);
const memoryStorage = new MemoryStorage();
const userState = new UserState(memoryStorage);
[...]
const bot = new ExampleBot(conversationState, userState);
В своем файле bot.js включите и создайте экземпляр userState и назначьте профиль пользователя:
class ExampleBot {
constructor(conversationState, userState) {
[...]
const USER_PROFILE = 'userProfile';
this.userProfile = userState.createProperty(USER_PROFILE);
this.userState = userState;
[...]
}
Теперь вы можете получить доступ к userState. Вы можете сделать это как часть OnTurn:
async onTurn(turnContext) {
if (turnContext.activity.type === ActivityTypes.Message) {
const userProfile = await this.userProfile.get(turnContext, {});
const conversationData = await this.conversationData.get(
turnContext, { promptedForUserName: false });
if (!userProfile.name) {
if (conversationData.promptedForUserName) {
userProfile.name = turnContext.activity.text;
await turnContext.sendActivity(`Thanks ${userProfile.name}.`);
conversationData.promptedForUserName = false;
} else {
await turnContext.sendActivity('What is your name?');
conversationData.promptedForUserName = true;
}
await this.userProfile.set(turnContext, userProfile);
await this.userState.saveChanges(turnContext);
}
}
}
или как часть водопада / шага:
async someWaterfallStep(step) {
const user = await this.userProfile.get(step.context, {});
if (!user.name) {
[do something]
} else {
await step.context.sendActivity(`Hello ${user.name}. Nice to meet you!`);
return step.endDialog()
}
}
Вы можете узнать больше о настройке состояния пользователя в этом документ .
Надежда на помощь!